2012-08-08 17 views
7

संभव डुप्लिकेट एक संग्रहीत प्रक्रिया में में खंड बनाने:
Need help in dynamic query with IN Clauseगतिशील रूप

मैं एसक्यूएल सर्वर 2008 का उपयोग कर रहा है और इस समस्या यह है कि मैं का सामना करना पड़ रहा है। मेरे पास एक कॉलम कंपनी नाम वाली कार है। अब मैं एक संग्रहीत प्रक्रिया है कि इस

 
CREATE PROCEDURE FindCars (@CompanyNames varchar(500)) 
AS 
SELECT * FROM Cars WHERE Company IN (@CompanyNames) 

तरह दिखता है मैं कुछ इस तरह की कोशिश की और

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

exec FindCars @CompanyNames 

मैं किसी भी पंक्तियों लौटे मिल न विफल रहा है। जब मैं निम्नलिखित

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

Select @CompanyNames 

मैं निम्नलिखित परिणाम

 
'Ford','BMW' 

हो और अगर मैं संग्रहीत प्रक्रिया के अंदर का चयन करें बयान में यह मान के स्थान पर, यह

 
SELECT * FROM Cars where Company in ('Ford','BMW') 

इस प्रकार मैं काम करता है कर लगता है कि संग्रहीत प्रक्रिया 'Ford','BMW' का इलाज एक सरणी के बजाय एक स्ट्रिंग के रूप में कर रही है। क्या कोई मेरी मदद कर सकता है। मैं संग्रहीत प्रक्रिया के अंदर चयन कथन के IN खंड में आवश्यक स्ट्रिंग/सरणी को गतिशील रूप से कैसे बना सकता हूं।

उत्तर

7

आप सही हैं, आपने एक स्ट्रिंग बनाई है, और इसे स्ट्रिंग्स की एक सूची के रूप में संसाधित किया जा रहा है जिसमें एक स्ट्रिंग है। अल्पविराम केवल एक स्ट्रिंग में वर्ण हैं। एसक्यूएल सर्वर में एक सरणी के लिए एकमात्र समतुल्य एक सारणी है।

उदाहरण के लिए; WHERE x IN (SELECT y FROM z)

इस कारण कई लोगों को एक SPLIT_STRING() समारोह है कि किसी दिए गए अल्पविराम delimitted स्ट्रिंग से मदों की एक तालिका लौटाता है ...

WHERE x IN (SELECT item FROM dbo.split_string(@input_string)) 

वहाँ कि विभाजन स्ट्रिंग को लागू करने के लिए कई तरीके हैं पैदा करते हैं। कुछ रिटर्न स्ट्रिंग्स, कुछ पूर्णांक में डाले जाते हैं, कुछ दूसरे "डेलीमीटर" पैरामीटर इत्यादि को स्वीकार करते हैं। आप SQL SERVER SPLIT STRING के लिए इंटरनेट खोज सकते हैं और कई परिणाम प्राप्त कर सकते हैं - यहां स्टैक ओवरव्लो में शामिल है।


एक वैकल्पिक गतिशील एसक्यूएल उपयोग करने के लिए है, एसक्यूएल एसक्यूएल लिखता है।

SET @sql = 'SELECT * FROM x WHERE y IN (' + @input_string_list + ')' 

SP_EXECEUTESQL @sql 

(मैं सिर्फ EXEC से अधिक SP_EXECUTESQL की सलाह देते हैं क्योंकि पूर्व आप parameterised प्रश्नों का उपयोग करने की अनुमति देता, लेकिन बाद नहीं करता है।)

+1

सिर्फ एक बिंदु जोड़ने के लिए, मुझे लगता है कि यह बेहतर है 'चयन * कारों से आंतरिक में शामिल हों ( \t dbo.split_string (@input_string) से आइटम चुनें) के पर।आइटम = कंपनी' क्योंकि आप 'IN' भविष्यवाणी –

+0

का उपयोग करके पुनरावृत्ति कर रहे हैं पहली विधि वह है जिसे मैं अनुशंसा करता हूं, आप यहां एक अच्छा स्प्लिट फ़ंक्शन पा सकते हैं: [http://www.sqlservercentral.com/articles/Tally+Table /72993/](http://www.sqlservercentral.com/articles/Tally+Table/72993/) – lennin92

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