दिलचस्प पोस्ट
@PostConstruct विधि पर लेनदेन @ numpy: सूचकांक arrays के साथ कुशलता से संक्षेप आईओएस 7: स्टेटस बार के तहत यूआईटीबलदृश्य दिखाता है "क्वेरी फ़ंक्शन का चयन 2 अपरिभाषित त्रुटि के लिए परिभाषित नहीं" मैं SQL सर्वर में एक संग्रहीत कार्यविधि से पैरामीटर की एक सूची कैसे प्राप्त करूं? स्क्रीन ओरियनेशन लॉक एक्स डेटा में शामिल होने से क्यों जुड़ता है कि पूर्ण बाहरी सम्मिलित हों या एक बाएं जुड़ने की अनुमति न हो? एएनटीएलआर: क्या कोई सरल उदाहरण है? पता लगाएँ कि एक आउटगोइंग कॉल का उत्तर दिया गया है या नहीं कैसे 'कट' कमांड को कई अनुक्रमिक सीमांकक को एक के रूप में व्यवहार करने के लिए? $ (दस्तावेज़) .click () iPhone पर सही ढंग से काम नहीं कर रहा है jquery अजगर में कार्य करने के लिए सूची को कैसे विस्तारित करें बच्चे के मूल्य के आधार पर तत्व का चयन करने के लिए XPath एक सूची में तत्वों की आवृत्ति कैसे गिनेंगी? डब्ल्यूपीएफ कॉम्बो बॉक्स प्रदर्शनमबरपाथ, चयनित वैल्यू और चयनित वैल्यू पाथ के साथ भ्रमित

SQL सर्वर – एक घोषित चर के साथ खंड में

मान लीजिए मुझे निम्न मिला है:

DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = 3 + ', ' + 4 + ' ,' + '22' SELECT * FROM A WHERE Id NOT IN (@ExcludedList) 

त्रुटि: varchar मान ',' डेटा प्रकार int को बदलने में रूपांतरण विफल रहा।

मैं समझता हूं कि त्रुटि क्यों है लेकिन मुझे नहीं पता कि उसे कैसे हल करना है …

वेब के समाधान से एकत्रित समाधान "SQL सर्वर – एक घोषित चर के साथ खंड में"

आपको इस तरह एक गतिशील सपा के रूप में निष्पादित करने की आवश्यकता है

 DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = '3,4,22,6014' declare @sql nvarchar(Max) Set @sql='SELECT * FROM [A] WHERE Id NOT IN ('+@ExcludedList+')' exec sp_executesql @sql 

यह एक ऐसा उदाहरण है, जहां मैं तालिका खंड में एक इन खंड में एकाधिक मानों को सूचीबद्ध करने के लिए उपयोग करता हूं। स्पष्ट कारण यह है कि लंबी सूची में मूल्यों की सूची केवल एक ही जगह में बदलने में सक्षम हो।

इसे और अधिक गतिशील बनाने और उपयोगकर्ता इनपुट को उगलने के लिए, मैं इनपुट के लिए एक varchar वैरिएबल घोषित करने का सुझाव देता हूं और फिर चर में डेटा को चरम करने के लिए WHILE और तालिका चर में डालने का सुझाव देता हूं।

बदलें @Your_list, your_table और वास्तविक सामान के साथ मान

 DECLARE @your_list TABLE (list varchar(25)) INSERT into @your_list VALUES ('value1'),('value2376') SELECT * FROM your_table WHERE your_column in ( select list from @your_list ) 

चुनिंदा वक्तव्य उसी तरह होगा जैसा कि:

 SELECT * FROM your_table WHERE your_column in ('value','value2376' ) 
 DECLARE @IDQuery VARCHAR(MAX) SET @IDQuery = 'SELECT ID FROM SomeTable WHERE Condition=Something' DECLARE @ExcludedList TABLE(ID VARCHAR(MAX)) INSERT INTO @ExcludedList EXEC(@IDQuery) SELECT * FROM A WHERE Id NOT IN (@ExcludedList) 

मुझे पता है कि मैं एक पुरानी पोस्ट का जवाब दे रहा हूं, लेकिन जब मैं गतिशील एसक्यूएल का उपयोग करना चाहूं तो वेरिएबल टेबल्स का उपयोग कैसे करना है इसका एक उदाहरण साझा करना चाहता था। मुझे यकीन नहीं है कि इसका सबसे कारगर तरीका है, हालांकि यह मेरे लिए अतीत में काम किया है जब गतिशील SQL एक विकल्प नहीं था।

सबसे पहले, एक त्वरित कार्य बनाएं जो एक तालिका में मानों की एक सीमांकित सूची को विभाजित करेगा, जैसे:

 CREATE FUNCTION dbo.udf_SplitVariable ( @List varchar(8000), @SplitOn varchar(5) = ',' ) RETURNS @RtnValue TABLE ( Id INT IDENTITY(1,1), Value VARCHAR(8000) ) AS BEGIN --Account for ticks SET @List = (REPLACE(@List, '''', '')) --Account for 'emptynull' IF LTRIM(RTRIM(@List)) = 'emptynull' BEGIN SET @List = '' END --Loop through all of the items in the string and add records for each item WHILE (CHARINDEX(@SplitOn,@List)>0) BEGIN INSERT INTO @RtnValue (value) SELECT Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List)-1))) SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn,@List) + LEN(@SplitOn), LEN(@List)) END INSERT INTO @RtnValue (Value) SELECT Value = LTRIM(RTRIM(@List)) RETURN END 

फिर फ़ंक्शन को इस तरह कॉल करें …

 SELECT * FROM A LEFT OUTER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value WHERE f.Id IS NULL 

यह हमारी परियोजना पर वास्तव में अच्छी तरह से काम किया है …

बेशक, विपरीत भी किया जा सकता है, अगर यह मामला था (हालांकि आपका प्रश्न नहीं)।

 SELECT * FROM A INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value 

और यह वास्तव में उपयोगी है जब उन रिपोर्टों के साथ काम करना होता है जिनके पास वैकल्पिक बहु-चयन पैरामीटर सूची है। यदि पैरामीटर नल है, तो आप सभी मान चुनना चाहते हैं, लेकिन अगर एक या अधिक मान हैं तो आप उन मानों पर फ़िल्टर किए गए रिपोर्ट डेटा चाहते हैं। फिर इस तरह एसक्यूएल का उपयोग करें:

 SELECT * FROM A INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value OR @ExcludeList IS NULL 

इस तरह, अगर @ExcludeList एक शून्य मान है, या शामिल होने के लिए एक स्विच एक स्विच होता है जो इस मान पर फ़िल्टरिंग बंद करता है। बेहद सुविधाजनक…

आप किसी IN खंड में एक चर का उपयोग नहीं कर सकते – आपको डायनामिक एसक्यूएल का उपयोग करने की आवश्यकता है, या किसी तालिका में मानों की सूची को कनवर्ट करने के लिए फ़ंक्शन (टीएसक्यूएल या सीएलआर) का उपयोग करना है ।

डायनेमिक एसक्यूएल उदाहरण:

 DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = 3 + ',' + 4 + ',' + '22' DECLARE @SQL NVARCHAR(4000) SET @SQL = 'SELECT * FROM A WHERE Id NOT IN (@ExcludedList) ' BEGIN EXEC sp_executesql @SQL '@ExcludedList VARCHAR(MAX)' @ExcludedList END 

मुझे लगता है समस्या में है

 3 + ', ' + 4 

इसे बदलने के लिए

 '3' + ', ' + '4' DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = '3' + ', ' + '4' + ' ,' + '22' SELECT * FROM A WHERE Id NOT IN (@ExcludedList) 

SET @ExcludedListe करें कि आपकी क्वेरी बननी चाहिए

भी

 SELECT * FROM A WHERE Id NOT IN ('3', '4', '22') 

या

 SELECT * FROM A WHERE Id NOT IN (3, 4, 22) 

इसे इस्तेमाल करे:

 CREATE PROCEDURE MyProc @excludedlist integer_list_tbltype READONLY AS SELECT * FROM A WHERE ID NOT IN (@excludedlist) 

और फिर इसे इस तरह कहते हैं:

 DECLARE @ExcludedList integer_list_tbltype INSERT @ExcludedList(n) VALUES(3, 4, 22) exec MyProc @ExcludedList 

मुझे गतिशील क्वेरी के बिना ऐसा करने का दूसरा समाधान है। हम इसे एक्सक्वरी की मदद से भी कर सकते हैं

  SET @Xml = cast(('<A>'+replace('3,4,22,6014',',' ,'</A><A>')+'</A>') AS XML) Select @Xml SELECT A.value('.', 'varchar(max)') as [Column] FROM @Xml.nodes('A') AS FN(A) 

यह पूरा समाधान है: http://raresql.com/2011/12/21/how-to-use-multiple-values-for-in-clause-using-same-parameter-sql-server/