2009-04-09 43 views
0

我想创建动态SQL代码来自动创建表复制。动态SQL Server问题

我被困在如何使下面的代码动态化,以便它可以传递SQL变量并在代码中使用它们。我帮助自己在与搜索的时刻,更换'TODO:'部分,这是不是很不错...以下是代码:

DECLARE @sql VARCHAR(MAX) 
SET @sql = '' 

SELECT 
    @sql = @sql + 
     'exec sp_addarticle @publication = ''TODO:TREP_PUBLICATION_NAME'',@article = N''' + 
     name + 
     ''', @source_owner = N''dbo'', @source_object = N''' + 
     name + 
     ''', @type = N''logbased'', @description = N'''', @creation_script = N'''', @pre_creation_cmd = N''delete'', @schema_option = 0x0000000000000000, @identityrangemanagementoption = N''none'', @destination_table = N''' + 
     name + 
     ''', @destination_owner = N''dbo'', @status = 8, @vertical_partition = N''false'', @ins_cmd = N''SQL'', @del_cmd = N''SQL'', @upd_cmd = N''SQL''' 
FROM 
    TODO:PUBLICATION_DB.sys.tables 
WHERE 
    type  = 'U' 
    AND name IN (
    SELECT 
     name 
    FROM 
     OPENROWSET('SQLOLEDB', 'TODO:SUBSCRIBER_SERVER'; 
       'TODO:SUBSCRIBER_LOGIN'; 
       'TODO:SUBSCRIBER_PASSWORD', 'select * from TODO:SUBSCRIBER_DB.sys.tables where type=''U''') 
) 
    AND name IN (
    SELECT 
     TABLE_NAME 
    FROM 
     TODO:PUBLICATION_DB.INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE 
     TODO:TABLE_NAME_FILTER 
) 

EXEC(@Sql) 

的一个问题是,我需要一个动态的SQL块内的动态SQL。如果有人可以帮助我使用变量转换此代码,我真的很感激!

感谢 丹尼尔

+0

你可能想要关闭/删除这个问题(因为它显然是本地化的以吸引答案),并用一个尽可能简单的人为问题来重新提出问题。没有太多细节,只是“​​动态SQL中的动态SQL”情况。 – Tomalak 2009-04-09 15:47:08

回答

0

动态SQL可能不是答案 - 但是,这并不意味着你不能使它更容易实现自动化和“参数IZE”。

换句话说,我曾经管理过一个庞大的复制拓扑结构,我经常不得不拆除订户,甚至(偶尔)重新创建出版物,等等。我不是试图生成动态查询事物并一举完成所有事情的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。但通过使用这两者,我发现我能够轻松地驯服一些必要的更多冗余任务,而不会使事情过于复杂。