मैं पोर्टेबल एसक्यूएल कैसे लिखूं जो एक लिंक किए गए सर्वर को संदर्भित करता है?


9

मुझे एक संग्रहीत प्रक्रिया मिली है जो एक लिंक किए गए सर्वर को संदर्भित करता है। प्रक्रिया के दौरान कई स्थानों पर मुझे निम्नलिखित जैसा कुछ मिला है:

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

यह प्रक्रिया मेरे विकास परिवेश, परीक्षण वातावरण और लाइव वातावरण में मौजूद है।

समस्या यह है कि प्रक्रिया की प्रत्येक प्रति सूक्ष्म रूप से भिन्न होती है क्योंकि सर्वर नाम प्रत्येक वातावरण के लिए अलग-अलग होते हैं। यह स्क्रिप्ट अपडेट की तैनाती को परेशान करने वाला बनाता है।

क्या प्रक्रिया को पोर्टेबल बनाने का एक तरीका है ताकि प्रत्येक पर्यावरण इसके समान संस्करण चला सके?

यदि नहीं, तो क्या वहाँ कुछ भी है जो मैं स्क्रिप्ट तैनाती को गलतियों / त्रुटियों के लिए कम प्रवण बना सकता हूं?


3
क्या एक ऐसा दृश्य बनाना है जो प्रत्येक सर्वर पर एक विकल्प के रूप में भिन्न हो? आप दृश्य को परिभाषित कर सकते हैं, SELECT <fields> FROM <linked server>लेकिन कोड बनाए रखने के लिए सभी सर्वरों पर समान दृश्य नाम का उपयोग कर सकते हैं
JNK

@JNK यह एक बुरा विचार नहीं है, हालांकि इसमें कुछ सारणियां हैं, लेकिन कम से कम विचार पूरे सर्वर से लिंक किए गए लिंक किए गए सर्वर संदर्भों के साथ संग्रहीत कार्यविधि को बनाए रखने के लिए सरल होंगे।
डॉक्टर जोन्स 14

@jnk, आपको इसका जवाब देना चाहिए।
एचएलजीईएम

जवाबों:


14

आपके लिंक किए गए सर्वर का नाम सर्वर का नाम होना जरूरी नहीं है। आप एक सामान्य नाम का उपयोग कर सकते हैं।

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

प्रत्येक परिवेश पर एक ही नाम के साथ लिंक किए गए सर्वर को सेट करें, लेकिन वास्तव में उन्हें अलग-अलग सर्वरों पर इंगित करें।


0

मुझे जेनेरिक लिंक्ड सर्वर नाम का उपयोग करने का विचार पसंद है। हालांकि, कई वातावरणों में यह संभव नहीं हो सकता है, इस मामले में, आप अपने सपा में गतिशील एसक्यूएल का उपयोग कर सकते हैं।

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
मैं यह नोट करूंगा कि अगर मैं वास्तविक जीवन में ऐसा कर रहा था, तो मैं एक ट्रायल कैच ब्लॉक का उपयोग करूंगा और एक त्रुटि का सामना करूंगा यदि @linkedservername सेट स्टेटमेंट के बाद आपको यह बताने के लिए अशक्त था कि यह गलत सर्वर पर चलाया गया था।
HLGEM

1
यदि आपने यह दृष्टिकोण लिया है, तो मुझे लगता है कि मैं एक फ़ंक्शन में CASE कथन को लपेटूंगा ताकि यदि कोई सर्वर बदल जाए, तो मुझे केवल फ़ंक्शन को अपडेट करना होगा।
एली

अच्छा बिंदु @Eli
HLGEM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.