2009-04-09 71 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。但通過使用這兩者,我發現我能夠輕鬆地馴服一些必要的更多冗餘任務,而不會使事情過於複雜。