2011-01-25 16 views
6

पर SQL सर्वर 2008 पर संयोजित करें, मैं सभी चयनित मानों की एक अल्पविराम से अलग सूची को एक चर में अलग करने की कोशिश कर रहा हूं।एसक्यूएल मानों को एक चर

SELECT field 
FROM table 

रिटर्न:

+-------+ 
| field | 
+-------+ 
| foo | 
+-------+ 
| bar | 
+-------+ 

मैं प्राप्त करना चाहते हैं: "foo, बार,"

मैंने कोशिश की:

DECLARE @foo NVARCHAR(MAX) 
SET @foo = '' 

SELECT @foo = @foo + field + ',' 
FROM TABLE 

PRINT @foo 

कौन सा कुछ भी नहीं देता है। मैं क्या गलत कर रहा हूं?

+2

क्या आपकी तालिका में कोई एनयूएलएल है? –

उत्तर

8

पूर्ण विराम वाले रिटर्न "foo, बार" आप NULLs बदलने

SELECT @foo = @foo + ISNULL(field + ',', '') 
FROM TABLE 

या उन्हें

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field IS NOT NULL 
+1

ओह प्रिय, अनाम डाउनवोट ... – gbn

+0

मेरी इच्छा है कि मैं फिर से उभारा क्योंकि यह एक बिल्कुल सही जवाब है। – VoodooChild

3

ऐसा होता है यदि आपके पास तालिका में एक एकल क्षेत्र भी है जो नल है। SQL सर्वर में, NULL + <any> = NULL। या तो उन्हें

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field is not null 

या काम उनके आसपास

SELECT @foo = @foo + isnull(field + ',', '') 
FROM TABLE 

आप अग्रणी सेट बयान है जिसमें ज्यादा आम है बिना पूरी बात लिख सकते हैं छोड़ देते हैं। नीचे इस क्वेरी कोई अल्पविराम

DECLARE @foo NVARCHAR(MAX) 
SELECT @foo = isnull(@foo + ',', '') + field 
FROM TABLE 
WHERE field is not null 

PRINT @foo 
+0

मैं इस दृष्टिकोण का उपयोग करने की अनुशंसा नहीं करता क्योंकि यह अविश्वसनीय है। अधिक जानकारी [निष्पादन योजना और समग्र संगतता प्रश्नों के परिणाम अभिव्यक्ति स्थान पर निर्भर करते हैं] (https://support.microsoft.com/en-us/kb/287515) और [nvarchar concatenation/index/nvarchar (अधिकतम) निष्पक्ष व्यवहार] (http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable- व्यवहार) – lad2025

+0

यह दिखाए गए रूपों में 100% भरोसेमंद काम करता है, यानी बिना आदेश के। एक आदेश के बिना, चर बढ़ता रहता है और प्रसंस्करण के अंत में, यह अंतिम परिणाम के रूप में बनी हुई है। जब ऑर्डर BY में आता है, क्वेरी निष्पादन को प्रत्येक पंक्ति में '@ var' के कुछ क्षणिक मान के साथ वर्चुअल टेम्प डेटासेट को बनाए रखने के लिए मजबूर किया जाता है। इन "क्षणिक पंक्तियों" पर ऑर्डर करने के बाद, 'वेरिएबल' राज्य के कुछ ऐतिहासिक संस्करण को असाइनमेंट के अंतिम मूल्य के रूप में छाप दिया जाता है। कहानी का नैतिक है - ऑर्डर का उपयोग न करें, या एक्सएमएल के लिए उपयोग करें। – RichardTheKiwi

1

हटाने का उपयोग करने के लिए मत भूलना करने की आवश्यकता होगी LTRIM और RTRIM लगभग @foo (जब डेटा प्रकार char/varchar) संगतता में अन्य यह अपेक्षित पुनरुत्थान नहीं देगा एसक्यूएल 2008 आर 2 में टीएस।

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