यदि आप इसे गतिशील रूप से ऐसा करना चाहते हैं तो आपको गतिशील एसक्यूएल का उपयोग करना होगा। इसका मतलब कुछ भी होगा जिसे आप उस डीबी के संदर्भ में निष्पादित करना चाहते हैं, आपको डायनामिक एसक्यूएल स्टेटमेंट में भी शामिल करना होगा।
यानी मान लें कि आप MainDB में सभी तालिकाओं को सूचीबद्ध करना चाहते हैं:
यह काम नहीं करेगा, क्योंकि USE स्टेटमेंट एक अलग संदर्भ में है - एक बार जब EXECUTE चला जाता है, तो निम्न SELECT उसी संदर्भ में नहीं चल रहा होगा और इसलिए MainDb में नहीं चल रहा होगा (जब तक कि कनेक्शन पहले से सेट नहीं किया गया था) मेनडीबी)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
तो आपको यह करना होगा:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
बेशक, आपको SQL इंजेक्शन से बहुत सावधान रहने की आवश्यकता है, जिसके लिए मैं आपको बैरी के उत्तर में लिंक की ओर इशारा करता हूं।
SQL इंजेक्शन को रोकने के लिए, आप QUOTENAME () फ़ंक्शन का भी उपयोग कर सकते हैं, यह वर्ग कोष्ठक में पैरामीटर लपेटता है:
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);