बस
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 इंजेक्शन के संदर्भ में ।
अंत में, चूंकि आप टैग करते हैं sql-server
और आप संस्करण निर्दिष्ट नहीं करते हैं, मेरा सुझाव है कि आप SPLIT_STRING()
फंक्शन (2016+) रथर आपकी तुलना में, और यदि आपके पास 2016+ संस्करण नहीं है, तो WHILE
का उपयोग किए बिना अपना खुद का बनाएं अधिक अच्छा प्रदर्शन प्राप्त करने के लिए लूप, कारण WHILE
लूप धीमा प्रदर्शन करेगा, इस प्रकार आपको इससे बचना चाहिए।
उदाहरण: