TSQL का उपयोग करके डेटाबेस को गतिशील रूप से कैसे बदलें


11

मैं गतिशील SQL में निर्दिष्ट डेटाबेस के लिए SSMS के संदर्भ को गतिशील रूप से बदलने की कोशिश कर रहा हूँ:

EXEC sys.sp_executesql N'USE db1 ' ;

हालांकि यह सफलतापूर्वक SSMS के डेटाबेस संदर्भ में परिवर्तन नहीं करता है।

मैंने ऊपर की तरह एक मामूली संशोधन की कोशिश की है

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql

फिर, यह सफलतापूर्वक निष्पादित होता है, लेकिन डेटाबेस नहीं बदलता है।


4
आप SSMS में उपयोग किए जा रहे सत्र के लिए एक sp_executesql के भीतर संदर्भ नहीं बदल सकते। संदर्भ केवल आपके डायनामिक SQL सत्र के दौरान मान्य है - SSMS सत्र के लिए नहीं।
लोथर क्रानर

जवाबों:


7

SSMS नहीं करेंगे, मैं दोहराता हूं, आप डैनियामिक एसक्यूएल में दौड़ रहे एक कमांड का उपयोग करने के लिए नहीं होंगे

यदि अंतिम लक्ष्य चुने हुए डेटाबेस के अंदर कुछ अन्य गतिशील एसक्यूएल को निष्पादित करना है, तो यह काफी आसान है:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME();';

EXEC @exec @sql;

यदि आपको पैरामीटर पारित करने की आवश्यकता है, तो कोई समस्या नहीं:

DECLARE @db sysname = N'db1', @i int = 1;

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME(), @i;';

EXEC @exec @sql, N'@i int', @i;

यदि लक्ष्य चुने हुए डेटाबेस के अंदर कुछ स्थिर SQL को निष्पादित करना है , तो शायद आपको प्रत्येक डेटाबेस में संग्रहीत प्रक्रिया में उस स्थिर SQL को संग्रहीत करने पर विचार करना चाहिए और इसे गतिशील रूप से इस तरह से कॉल करना चाहिए:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'EXEC dbo.procedurename;';

EXEC @exec @sql;

और उम्मीद है कि अंतिम लक्ष्य एसएसएमएस में यह सब कोड नहीं चलाना है, ताकि एसएसएमएस अब के संदर्भ में है @db... डैनियल वास्तव में इसे पसंद करेंगे अगर मैं स्पष्ट रूप से कहता हूं कि यह संभव नहीं है, जैसा कि @ लोथर की टिप्पणी में भी कहा गया है।


यह बहुत अच्छा है, धन्यवाद हारून बर्ट्रेंड। और नहीं, अंतिम लक्ष्य यह सब कोड SSMS में नहीं चलाना है, ताकि SSMS अब @db के संदर्भ में हो
Mazhar

2

डायनामिक SQL को वास्तव में विशेष रूप से इन-लाइन के साथ निष्पादित नहीं किया जाता है, बाकी कोड इसकी एक अलग इकाई है (भले ही इसे इन-लाइन के रूप में चलाया जाए

यदि आप कोड चलाते हैं: SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'अपने वर्तमान सेट के महल में आप उन परिणामों को नोटिस करेंगे जो वापस आते हैं, यह इंगित करते हैं कि आपने सक्रिय डेटाबेस को स्थानांतरित कर दिया है, लेकिन आप अभी भी उसी कनेक्शन के तहत चल रहे हैं।

यदि आप इन-लाइन डेटाबेस चयन को बदलना चाहते हैं तो सबसे अच्छा तरीका कुछ ऐसा करना है:

IF @db = 'db1'
    USE db1
ELSE IF @db = 'db2'
    USE db2

यह अच्छा या साफ नहीं है और संभावित डेटाबेस के लिए दो लाइनों की आवश्यकता होती है लेकिन यह काम पूरा कर लेगा (इसे डायनामिक एसक्यूएल में न चलाएं या आप अभी भी समाप्त हो जाएंगे, मुख्य मुद्दा भी यही होगा)

ध्यान दें कि USE कमांड का उपयोग प्रक्रियाओं / कार्यों में निषिद्ध है

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