सलाह का एक शब्द। डायनेमिक स्क्रिप्ट का परीक्षण करते समय, पहले इसे निष्पादित करने के बजाय इसे प्रदर्शित करें। इस तरह आप इसे ठीक वैसे ही देख पाएंगे जैसे EXEC
. द्वारा देखा जाएगा बयान।
अब मुद्दे पर। आपको यह ध्यान रखना चाहिए कि आप चर . को पारित नहीं कर रहे हैं करने के लिए SplitValues
लेकिन इसके बजाय वेरिएबल के मान को स्क्रिप्ट में जोड़ रहे हैं। चूंकि मान varchar
. है , इसे इसके चारों ओर उद्धरण चिह्नों के साथ जोड़ा जाना चाहिए। उनकी अनुपस्थिति ही वास्तव में एकमात्र समस्या है।
दूसरे तर्क के आसपास के उद्धरण, अल्पविराम, सही ढंग से बच गए हैं दोनों मामलों में . तो, पहले तर्क के आसपास उद्धरण जोड़ने के लिए किसी भी तरीके का उपयोग करें:
-
उद्धरण चिह्न की पुनरावृत्ति:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
CHAR(39)
. का उपयोग करके :DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')'; SELECT @sql;
जाहिर है, पहली विधि अधिक कॉम्पैक्ट है, लेकिन, जैसा मैंने कहा, दोनों अच्छी तरह से काम करते हैं, जैसा कि यह SQL Fiddle डेमो स्पष्ट रूप से दिखाता है।
हालाँकि, ध्यान दें कि यदि आप सजा को माफ कर देते हैं, तो आप इस मुद्दे से आसानी से बच सकते हैं। EXEC ()
. के बजाय , आप उपयोग कर सकते हैं EXEC sp_executesql
, जो आपको पैरामीटर . का उपयोग करने की अनुमति देता है . यहाँ वही स्क्रिप्ट है जिसे sp_executesql
use का उपयोग करने के लिए फिर से लिखा गया है :
DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
N'SELECT * FROM SplitValues(@year_param,@delim_param)',
N'@year_param varchar(max), @delim_param char(1)',
@year,@delim;
जैसा कि आप देख सकते हैं, उद्धरणों से बचने के बारे में चिंता करने की कोई आवश्यकता नहीं है:SQL सर्वर मूल्यों को सही ढंग से प्रतिस्थापित करने की परेशानी लेता है, आप नहीं।