문제

테이블 반복을 자동으로 생성하기 위해 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을 사용했습니다. 그러나 두 가지를 모두 사용함으로써, 나는 과도하게 복잡하지 않고 필요한 더 중복 작업을 쉽게 길들이는 것을 쉽게 길들이는 것을 발견했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top