Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं कुछ ऐसा कैसे कर सकता हूं:USE @databaseName

यदि आप इसे गतिशील रूप से ऐसा करना चाहते हैं तो आपको गतिशील एसक्यूएल का उपयोग करना होगा। इसका मतलब कुछ भी होगा जिसे आप उस डीबी के संदर्भ में निष्पादित करना चाहते हैं, आपको डायनामिक एसक्यूएल स्टेटमेंट में भी शामिल करना होगा।

यानी मान लें कि आप 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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर:क्या एक ही समय में दो तालिकाओं में सम्मिलित करना संभव है?

  2. मैं SQL सर्वर में डेटाटाइम कैसे छोटा कर सकता हूं?

  3. SQUARE () SQL सर्वर में उदाहरण

  4. SQL सर्वर संग्रह सूची स्क्रिप्ट -1

  5. SQL सर्वर में पंक्तियों को रैंक करने के तरीके:ROW_NUMBER (), RANK (), DENSE_RANK () और NTILE ()