मुझे कई foo.sql
प्रश्नों को रिफ्लेक्टर और दस्तावेज करना है, जो डीबी टेक सपोर्ट (ग्राहक कॉन्फ़िगरेशन और उस तरह की चीजों के लिए) की एक टीम द्वारा साझा किए जाएंगे। टिकट के प्रकार हैं जो नियमित रूप से आते हैं जहां प्रत्येक ग्राहक के पास अपने सर्वर और डेटाबेस होते हैं, लेकिन अन्यथा स्कीमा पूरे बोर्ड में समान होते हैं।
मौजूदा समय में संग्रहीत प्रक्रियाएं एक विकल्प नहीं हैं। मैं इस बात पर बहस कर रहा हूं कि डायनेमिक या एसक्यूसीएमडी का उपयोग करना है या नहीं, मैंने एसक्यूएल सर्वर पर थोड़ा नया होने के कारण इसका अधिक उपयोग नहीं किया है।
एसक्यूसीएमडी स्क्रिप्टिंग मुझे लगता है कि निश्चित रूप से "क्लीनर" मुझे लगता है, और आवश्यकतानुसार पढ़ने और प्रश्नों में छोटे बदलाव करना आसान है, लेकिन उपयोगकर्ता को एसक्यूसीएमडी मोड को सक्षम करने के लिए भी मजबूर करता है। डायनामिक अधिक कठिन है क्योंकि स्ट्रिंग हेरफेर का उपयोग करके क्वेरी को लिखे जाने के कारण सिंटैक्स हाइलाइटिंग हानि है।
इन्हें प्रबंधन स्टूडियो 2012, SQL संस्करण 2008R2 का उपयोग करके संपादित और चलाया जा रहा है। किसी एक विधि या दूसरे तरीके पर SQL सर्वर "बेस्ट प्रैक्टिस" में से किसी विधि के कुछ पेशेवरों / विपक्षों में से कुछ हैं? क्या उनमें से एक दूसरे की तुलना में "सुरक्षित" है?
गतिशील उदाहरण:
declare @ServerName varchar(50) = 'REDACTED';
declare @DatabaseName varchar(50) = 'REDACTED';
declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594';
declare @sql_OrderCheckQuery varchar(max) = ('
use {@DatabaseName};
select
-- stuff
from
{@ServerName}.{@DatabaseName}.[dbo].[client_orders]
as "Order"
inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ({@OrderIdsSeparatedByCommas});
');
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@ServerName}', quotename(@ServerName) );
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@DatabaseName}', quotename(@DatabaseName) );
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@OrderIdsSeparatedByCommas}', @OrderIdsSeparatedByCommas );
print (@sql_OrderCheckQuery); -- For debugging purposes.
execute (@sql_OrderCheckQuery);
SQLCMD उदाहरण:
:setvar ServerName "[REDACTED]";
:setvar DatabaseName "[REDACTED]";
:setvar OrderIdsSeparatedByCommas "597336, 595764, 594594"
use $(DatabaseName)
select
--stuff
from
$(ServerName).$(DatabaseName).[dbo].[client_orders]
as "Order"
inner join $(ServerName).$(DatabaseName).[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ($(OrderIdsSeparatedByCommas));
use
बयान शायद, बाहर छोड़ा जा सकता है के रूप में गुंजाइश इस विशेष स्क्रिप्ट के दौरान वैसे भी बदला नहीं जाएगा। मेरे पास उपयोग मामलों की एक छोटी संख्या है जहां क्रॉस-सर्वर खोज होगी लेकिन यह इस पद के दायरे से परे हो सकती है।
use ...
आपकी स्क्रिप्ट का उद्देश्य क्या है ? क्या बाद की क्वेरी के सही निष्पादन के लिए यह महत्वपूर्ण है? मैं पूछ रहा हूं क्योंकि यदि वर्तमान डेटाबेस को बदलना आपकी क्वेरी के अपेक्षित परिणामों में से एक है, तो गतिशील SQL संस्करण केवल इसे गतिशील क्वेरी के दायरे में बदल देगा, बाहरी दायरे में नहीं, SQLCMD भिन्नता के विपरीत (जो कि, बेशक, केवल एक गुंजाइश है)।