문제
테이블 반복을 자동으로 생성하기 위해 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이 필요하다는 것입니다. 누군가가 변수를 사용 하여이 코드를 변환하도록 도와 줄 수 있다면 정말 감사하겠습니다!
감사합니다 Daniel
해결책
동적 SQL이 답이 아닐 수도 있지만, 그렇다고해서 자동화하고 '매개 변수를 사용하는'것을 쉽게 만들 수 없다는 것을 의미하지는 않습니다.
다시 말해, 나는 한때 가입자를 자주 찢어 버리고 (때로는) 출판물을 재현 해야하는 거대한 복제 토폴로지를 관리했습니다. 동적으로 쿼리하고 한 번의 woop로 모든 것을 수행 한 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을 사용했습니다. 그러나 두 가지를 모두 사용함으로써, 나는 과도하게 복잡하지 않고 필요한 더 중복 작업을 쉽게 길들이는 것을 쉽게 길들이는 것을 발견했습니다.