سؤال

أريد إنشاء رمز DEMAMIC 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 Dynamic SQL هي الإجابة - ولكن هذا لا يعني أنه لا يمكنك تسهيل أتمتة و "المعلمة-ize".

بمعنى آخر، أدارت ذات مرة طوبولوجيا النسخ المتماثل الضخمة حيث كثيرا ما اضطررت إلى خفض المشتركين، وحتى (أحيانا) منشورات إعادة إنشاء، وهلم جرا. بدلا من Mucking مع محاولة توليد 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