ダイナミックSQL Serverの質問
-
06-09-2019 - |
質問
私は、自動的にテーブルの複製を作成するために、dymamic SQLコードを作成したい。
私はそれが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が必要だということです。誰かが、変数を使用してこのコードを変換するために私を助けることができれば、私は本当にそれをいただければ幸いです!
のおかげで ダニエル
解決
動的SQLは答えではないかもしれません - それは、あなたがそれが簡単に自動化すると「パラメータ-IZE」作ることができないという意味ではありません。
言い換えれば、私はかつて私は頻繁にように加入者を取り壊す、さらには(たまに)出版物を再作成し、しなければならなかった巨大なレプリケーショントポロジを管理していました。むしろ動的に物事を照会し、1落ち-急襲ですべてをしたT-SQLを生成しようとしていじくるよりも、私はT-SQLテンプレート(.tqlファイル)の数を作成して、私はその後、いくつかのパラメータを取り込むために使用することができること、およびその後、緩い回します。
あなたがテンプレートに慣れていないなら、そして、ちょうどこのビデオをチェックアウト - 迅速速度にあなたを取得しますれます:
http://www.sqlservervideos.com/video/using-sql -server-テンプレートの
そして、ここで私が記事を追加するために使用したテンプレートの種類の例です - あなたが撮影しているよう:
/* 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を持っていたこれらのテンプレートを使用していました。しかし、両方を使用して、私は非常に簡単にオーバー複雑なものなしで必要以上に冗長なタスクの一部を飼いならすことができたことがわかりました。