sql server 2005 - T-SQL: Cannot pass concatenated string as argument to stored procedure -


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

सेटअप :

  DECLARE @MyString varchar (500 ), @ मायबर varchar (10), @ मायफ़ू varchar (10) SELECT @ MyBar = 'baz' SELECT @ MyFoo = 'bat' - इस संग्रहीत प्रक्रिया को कॉल करने का प्रयास करें! EXEC DoSomeWork @MsgID, 'हैलो' + @ माइबर + '' विश्व! '' + @ माइफ़ू + ''। '  

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

यहां एक सही कार्यान्वयन है जो त्रुटि के बिना संकलित होता है:

  SELECT @ MyString = 'Hello' + @MyBar + " विश्व! "'+ @ माइफ़ू +' '।'; '; EXEC DoSomeWork @ID, @MyString  

प्रश्न : क्यों यह है कि टी-एसक्यूएल एक varchar के समाकलन को नियंत्रित नहीं कर सकता एक तर्क के रूप में? यह प्रकारों को जानता है, क्योंकि वे ठीक तरह से घोषित किया गया था।

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

EXECUTE कथन:

SET कथन:

एक्ज़ॉईटी के लिए सिंटैक्स केवल स्वीकार करता है मान

[[पैरामीटर =] { मान | @ विश्वसनीय [OUTPUT] | [DEFAULT]]

जबकि SET के लिए वाक्यविन्यास अभिव्यक्ति

{@ local_variable = अभिव्यक्ति }

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

  EXEC ('SELECT 1 + 1')  

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

टी-एसक्यूएल अभिव्यक्ति:


Comments

Popular posts from this blog

c++ - Linux and clipboard -

What is expire header and how to achive them in ASP.NET and PHP? -

sql server - How can I determine which of my SQL 2005 statistics are unused? -