2009-06-25 16 views
18

परिदृश्य को तर्क के रूप में श्रेणीबद्ध स्ट्रिंग पारित नहीं कर सकता: एक संग्रहीत प्रक्रिया के लिए n तर्क पारित करने के लिए की आवश्यकता है। तर्क का एक प्रकार varchar(x) की है। उस वर्चर तर्क को कुछ अन्य चरम चर से अलग किया जाना चाहिए। यह समस्या SQL सर्वर 2005 का उपयोग करती है, लेकिन यह व्यवहार SQL सर्वर के सभी संस्करणों पर लागू होता है।T-SQL: संग्रहीत प्रक्रिया

सेटअप:

DECLARE @MyString varchar(500), @MyBar varchar(10), @MyFoo varchar(10) 

SELECT @MyBar= 'baz ' 
SELECT @MyFoo= 'bat ' 

-- try calling this stored procedure! 
EXEC DoSomeWork @MsgID, 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".' 

यह एसक्यूएल सर्वर में अपवाद पैदा करता है: Incorrect syntax near '+'। आमतौर पर आप सोच सकते हैं कि डेटाप्रकार गलत होगा (अर्थात चर विभिन्न प्रकार के होते हैं, लेकिन है कि कोई दूसरा त्रुटि संदेश का उत्पादन होगा)।

SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".'; 

EXEC DoSomeWork @ID, @MyString 

प्रश्न:

यहाँ एक सही कार्यान्वयन कि त्रुटि के बिना संकलित है क्यों यह है कि T-SQL एक तर्क के रूप एक varchar के संयोजन संभाल सकते है? यह प्रकार जानता है, क्योंकि उन्हें वक्रार के रूप में ठीक से घोषित किया गया था।

उत्तर

19

EXECUTE कथन बस फिर चुनें और सेट की तरह अन्य बयान एक अलग व्याकरण है। उदाहरण के लिए, निम्नलिखित दो पृष्ठों के शीर्ष पर वाक्यविन्यास अनुभाग देखें।

EXECUTE कथन: http://msdn.microsoft.com/en-us/library/ms188332.aspx

सेट बयान: http://msdn.microsoft.com/en-us/library/ms189484.aspx

केवल निष्पादन के लिए वाक्य रचना एक मूल्य

[[@parameter =] {value | @variable [OUTPUT] | [DEFAULT]]

सेट के लिए वाक्यविन्यास जबकि स्वीकार करता है एक अभिव्यक्ति स्वीकार करता

{@local_variable = expression}

एक मूल्य मूल रूप से केवल एक कठिन कोडित स्थिर है, लेकिन एक अभिव्यक्ति का मूल्यांकन किया जा रहा है। यह वर्चर 'चयन 1 + 1' होने जैसा है। यह अभी सिर्फ एक वर्चर मूल्य है। हालांकि, अगर आप मूल्यांकन कर सकते हैं इस तरह स्ट्रिंग:

EXEC('SELECT 1 + 1') 

मुझे लगता है सब मैं उनका कहना है कर रहा हूँ है कि EXEC आदेश परिभाषा है, जो आप जाहिरा तौर पर पहले से ही पता चला द्वारा भाव अनुमति नहीं है। मैं क्या T-SQL के डेवलपर्स जहां जब वे इसे उस तरह से बनाया करने के इरादे पता नहीं है।मुझे लगता है कि व्याकरण केवल हाथ से बाहर हो जाएगा यदि आप एक संग्रहीत प्रक्रिया की पैरामीटर सूची में subqueries के भीतर subqueries फेंकने की अनुमति दी।

T-SQL अभिव्यक्ति: http://msdn.microsoft.com/en-us/library/ms190286.aspx

+2

इस टिप्पणी में निर्दिष्ट वेबसाइट अब नहीं है। – Buggieboy

+0

धन्यवाद। मैंने एमएसडीएन का उपयोग करने के लिए लिंक अपडेट किए हैं। – SurroundedByFish

2

जैसे आप अपने नीचे क्वेरी पर क्या कर रहे हैं यह हो सकता है क्योंकि यह गैर नियतात्मक (कम से कम कार्यों के लिए है आप इस या तो

exec SomeProc getdate() 

आप एक परम में सभी सामान डाल करने के लिए है की तरह कुछ नहीं कर सकते)

संबंधित मुद्दे