Динамический SQL может не быть ответом, но это не значит, что вы не можете упростить автоматизацию и «параметризацию».
Другими словами, я когда-то управлял огромной топологией репликации, где мне часто приходилось срывать подписчиков и даже (иногда) пересоздавать публикации и так далее. Вместо того чтобы пытаться сгенерировать T-SQL, который динамически запрашивал информацию и выполнял ВСЕ одним махом, я создаю несколько шаблонов T-SQL (файлы .tql), которые затем можно использовать для заполнения несколькими параметрами, затем освободиться.
А если вы не знакомы с шаблонами, просто посмотрите это видео, которое быстро поможет вам набрать скорость:
http://www.sqlservervideos.com/video/using-sql-server-templates
А вот пример того шаблона, который я использовал для добавления статей - пока вы стреляете:
/* Add Article */
USE [<database,sysname,--Default>]
GO
EXEC sp_addarticle
@publication = N'<publicationName,sysname,--Default>',
@article = N'<article_1,sysname,--Default>',
@source_owner = N'dbo',
@source_object = N'<article_1,sysname,--Default>',
@destination_table = N'<article_1,sysname,--Default>',
@type = N'logbased',
@creation_script = null,
@description = null,
@pre_creation_cmd = N'drop',
@schema_option = <bitmask_1,binary(8),0x000000000000CCD3>,
@status = 16,
@vertical_partition = N'false',
@ins_cmd = N'CALL sp_MSins_<article_1,sysname,--Default>',
@del_cmd = N'CALL sp_MSdel_<article_1,sysname,--Default>',
@upd_cmd = N'MCALL sp_MSupd_<article_1,sysname,--Default>',
@filter = null,
@sync_object = null,
@auto_identity_range = N'false'
GO
EXEC sp_addarticle
@publication = N'<publicationName,sysname,--Default>',
@article = N'<article_2,sysname,--Default>',
@source_owner = N'dbo',
@source_object = N'<article_2,sysname,--Default>',
@destination_table = N'<article_2,sysname,--Default>',
@type = N'logbased',
@creation_script = null,
@description = null,
@pre_creation_cmd = N'drop',
@schema_option = <bitmask_2,binary(8),0x000000000000CCD3>,
@status = 16,
@vertical_partition = N'false',
@ins_cmd = N'CALL sp_MSins_<article_2,sysname,--Default>',
@del_cmd = N'CALL sp_MSdel_<article_2,sysname,--Default>',
@upd_cmd = N'MCALL sp_MSupd_<article_2,sysname,--Default>',
@filter = null,
@sync_object = null,
@auto_identity_range = N'false'
GO
EXEC sp_addarticle
@publication = N'<publicationName,sysname,--Default>',
@article = N'<article_3,sysname,--Default>',
@source_owner = N'dbo',
@source_object = N'<article_3,sysname,--Default>',
@destination_table = N'<article_3,sysname,--Default>',
@type = N'logbased',
@creation_script = null,
@description = null,
@pre_creation_cmd = N'drop',
@schema_option = <bitmask_3,binary(8),0x000000000000CCD3>,
@status = 16,
@vertical_partition = N'false',
@ins_cmd = N'CALL sp_MSins_<article_3,sysname,--Default>',
@del_cmd = N'CALL sp_MSdel_<article_3,sysname,--Default>',
@upd_cmd = N'MCALL sp_MSupd_<article_3,sysname,--Default>',
@filter = null,
@sync_object = null,
@auto_identity_range = N'false'
GO
EXEC sp_addarticle
@publication = N'<publicationName,sysname,--Default>',
@article = N'<article_4,sysname,--Default>',
@source_owner = N'dbo',
@source_object = N'<article_4,sysname,--Default>',
@destination_table = N'<article_4,sysname,--Default>',
@type = N'logbased',
@creation_script = null,
@description = null,
@pre_creation_cmd = N'drop',
@schema_option = <bitmask_4,binary(8),0x000000000000CCD3>,
@status = 16,
@vertical_partition = N'false',
@ins_cmd = N'CALL sp_MSins_<article_4,sysname,--Default>',
@del_cmd = N'CALL sp_MSdel_<article_4,sysname,--Default>',
@upd_cmd = N'MCALL sp_MSupd_<article_4,sysname,--Default>',
@filter = null,
@sync_object = null,
@auto_identity_range = N'false'
GO
И в некоторых случаях ... Я также использовал эти шаблоны, которые, в свою очередь, имели некоторый вложенный / динамический SQL. Но, используя оба, я обнаружил, что смог очень легко справиться с некоторыми из более излишних задач, необходимых без чрезмерных усложнений.