سؤال ديناميكي SQL Server
-
06-09-2019 - |
سؤال
أريد إنشاء رمز 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 متداخلة / ديناميكية. ولكن باستخدام كليهما، وجدت أنني تمكنت من ترويض بعض المهام الأكثر اريا جدا دون تعقيد الأشياء.