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

मैं एक वेरिएबल कैसे पास करूं जिसमें एक गतिशील SQL क्वेरी की सूची हो?

बस

EXECUTE ('select id from  [dbo].[CSVToTable] ('''[email protected]+''')')
        declare @listOfIDs varchar(1000);

या, कौन सा बेहतर तरीका है

SET @listOfIDs = '5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61'; 

EXECUTE sp_executesql N'select id from  [dbo].[CSVToTable] (@listOfIDs)',
                      N'@listOfIDs VARCHAR(1000)',
                      @listOfIDs;
  • मुझे यह त्रुटि क्यों मिलती है?

क्योंकि आप वास्तव में बहुत अधिक पैरामीटर पास करते हैं, और अधिक आवश्यकता होती है, इसे समझने के लिए इस क्वेरी को चलाएं और देखें कि आप वास्तव में अपने फ़ंक्शन में क्या पास कर रहे हैं

SELECT 'select id from  [dbo].[CSVToTable] ('[email protected]+')';

जो वापस आ जाएगा (और यही वह है जिसे आप वास्तव में निष्पादित करने का प्रयास कर रहे हैं)

select id from  [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)

इसके बजाय (जो आपको चाहिए)

SELECT 'select id from  [dbo].[CSVToTable] ('''[email protected]+''')';
  • ठीक है, लेकिन क्यों sp_executesql exec . से बेहतर है ?

बस, EXEC आपको अपने सभी चरों को एक स्ट्रिंग में संयोजित करने के लिए बाध्य करेगा, यह इसके बारे में सबसे बुरी बात है, और यह आपके कोड को SQL इंजेक्शन के लिए पूरी तरह से खुला बनाता है। . देखें Bad Habits to Kick : Using EXEC() instead of sp_executesql , इसका मतलब यह नहीं है कि sp_executesql 100% सुरक्षित है, लेकिन यह बयानों को पैरामीटरीकृत . करने की अनुमति देता है जबकि EXEC() ऐसा नहीं है, इसलिए यह EXEC से अधिक सुरक्षित है SQL इंजेक्शन के संदर्भ में

अंत में, चूंकि आप टैग करते हैं और आप संस्करण निर्दिष्ट नहीं करते हैं, मेरा सुझाव है कि आप SPLIT_STRING() फंक्शन (2016+) रथर आपकी तुलना में, और यदि आपके पास 2016+ संस्करण नहीं है, तो WHILE का उपयोग किए बिना अपना खुद का बनाएं अधिक अच्छा प्रदर्शन प्राप्त करने के लिए लूप, कारण WHILE लूप धीमा प्रदर्शन करेगा, इस प्रकार आपको इससे बचना चाहिए।

उदाहरण:



  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. SQL सर्वर - UTF-8 एन्कोडिंग के साथ XML प्रकार के कॉलम को परिभाषित करना

  4. SQL सर्वर उपयोग के लिए Azure वर्चुअल मशीनें

  5. SQL सर्वर रनिंग पोर्ट कैसे खोजें?