2011-03-04 15 views
26

में श्रृंखलाबद्ध परिणाम मैं एक एसक्यूएल समारोह है कि इस कोड को भी शामिल किया है।एसक्यूएल क्वेरी एक स्ट्रिंग

स्पष्ट रूप से सी # कोड में एक फोरच लूप ऐसा करेगा, लेकिन मैं इसे एसक्यूएल में कैसे कर सकता हूं?

+1

द्वारा लौटाई गई पंक्तियों की तुलना में SQL सर्वर का ** संस्करण ** क्या है ?? की –

+1

संभव डुप्लिकेट [एसक्यूएल सर्वर: मैं एक स्तंभ में एकाधिक पंक्तियाँ परिसीमित अल्पविराम कर सकते हैं?] (http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows-into- एक कॉलम) और: http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query –

+0

कई बार जवाब दिया ... लेकिन देखो बाहर, नहीं सभी XML पथ के लिए concatenations कार्यान्वयन ठीक से पिछले एक जवाब देने के लिए मेरा उत्तर की तरह एक्सएमएल विशेष वर्ण (<, &, >, आदि) संभाल लेंगे होगा: http://stackoverflow.com/questions/5031204/does-t-sql-have- एक-समेकित-फ़ंक्शन-टू-कॉन्सटेनेट-स्ट्रिंग्स/5031297 # 5031297 –

उत्तर

68

यदि आप SQL Server 2005 या ऊपर हैं, तो आप इसका उपयोग कर सकते हैंचाल:

DECLARE @CodeNameString varchar(100) 

SELECT 
    @CodeNameString = STUFF((SELECT ',' + CodeName 
          FROM dbo.AccountCodes 
          ORDER BY Sort 
          FOR XML PATH('')), 
          1, 1, '') 

FOR XML PATH('') मूल रूप से अपने तार एक साथ एक में, लंबे समय से एक्सएमएल परिणाम (,code1,code2,code3 आदि की तरह कुछ) संयोजित और STUFF पहला वर्ण, उदा पर एक "कुछ भी नहीं" चरित्र डालता है आपको वह परिणाम देने के लिए "अनावश्यक" पहले कॉमा को मिटा देता है, जिसे आप शायद ढूंढ रहे हैं।

अद्यतन: ठीक है - मैं टिप्पणी नहीं समझते हैं - अगर डेटाबेस तालिका में अपने पाठ को पहले से ही <, > या &, तो मेरे वर्तमान समाधान की तरह वर्ण हैं वास्तव में &lt;, &gt;, और &amp; में उन सांकेतिक शब्दों में बदलना होगा ।

यदि आपको उस XML एन्कोडिंग में कोई समस्या है - तो हाँ, आपको @KM द्वारा प्रस्तावित समाधान को देखना चाहिए जो उन पात्रों के लिए भी काम करता है। चेतावनी से एक शब्द: यह दृष्टिकोण बहुत अधिक संसाधन और प्रसंस्करण गहन है - बस इतना ही आपको पता है।

+14

** यह एक्सएमएल विशेष पात्रों ('<', '&' , '>', आदि) ** को मेरे पिछले उत्तर की तरह ठीक तरह से संभाल नहीं पाएगा, यहां देखें: http://stackoverflow.com/questions/5031204/does-t-sql-have-an -ग्रेगेट-फ़ंक्शन-टू-कॉन्सटेनेट-स्ट्रिंग्स/5031297 # 5031297 –

+0

@marc_s यह खतरनाक है। मुझे ऊपर केएम की टिप्पणी गूंजनी होगी। – jnm2

+0

@ जेएनएम 2: सहमत - ** अगर ** किसी को उन विशेष पात्रों की आवश्यकता है, तो "केएम" द्वारा समाधान जाने का तरीका है। ** कैसे: ** यह ** बहुत कम ** अधिक प्रसंस्करण गहन है और इस प्रकार मैं इसे केवल ** ** ** का उपयोग करने की अनुशंसा करता हूं यदि आपके पास वास्तव में आपके आउटपुट –

23
DECLARE @CodeNameString varchar(max) 
SET @CodeNameString='' 

SELECT @[email protected]+CodeName FROM AccountCodes ORDER BY Sort 
SELECT @CodeNameString 
+0

सरल और पूरी तरह से काम करता है। धन्यवाद। – Ben

+0

सरल और सुरुचिपूर्ण जवाब। क्या इस विधि के उपयोग के लिए कोई सीमाएं हैं? (इस जवाब पर जेम्स विस्मान की विविधता द्वारा पूर्ण मूल्यों को नियंत्रित किया जाता है) – Pac0

10

@ AlexanderMP के जवाब सही है, लेकिन आप यह भी coalesce साथ nulls से निपटने पर विचार कर सकते हैं:

declare @CodeNameString nvarchar(max) 
set @CodeNameString = null 
SELECT @CodeNameString = Coalesce(@CodeNameString + ', ', '') + cast(CodeName as varchar) from AccountCodes 
select @CodeNameString 
+1

हां, मैं कोलेस/इज़नल के बारे में भूल गया। लेकिन क्या यह @ कोडनाम नाम 'की बजाय' कोडनाम 'की जांच करने के लिए बेहतर समझ नहीं लेगा? कोई इस तरह से डेटा खो सकता है। अभी तक बेहतर, कोयलेस्टे के बजाय, यह सादे पुराने 'जहां कोडनाम शून्य नहीं है' का उपयोग करने के लिए समझ में आता है। – AlexanderMP

4

SQL सर्वर 2005 के लिए और nulls के लिए उपयोग Coalesce ऊपर और मैं Cast or Convert उपयोग कर रहा हूँ अगर वहाँ numeric values कर रहे हैं -

declare @CodeNameString nvarchar(max) 
select @CodeNameString = COALESCE(@CodeNameString + ',', '') + Cast(CodeName as varchar) from AccountCodes ORDER BY Sort 
select @CodeNameString 
+0

100 थोड़ा छोटा है, आपको नहीं लगता कि ;-) –

+0

@ James- Hmm..just की नकल की है कि ओपी के प्रश्न को अद्यतन किया है से यह now..thanks ... btw यह डांग तुम मुझे यह करने के लिए हराया था .. – Vishal

0

यहां एक और वास्तविक जीवन उदाहरण है जो कम से कम 2008 रिलीज (और बाद में) के साथ ठीक काम करता है।

इस मूल प्रश्न जो सरल max() का उपयोग करता मूल्यों के कम से कम एक पाने के लिए है:

SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted" 
FROM Value_list group by Option_name, Field_M3_name 
ORDER BY option_name, Field_M3_name 

उन्नत संस्करण है, जहां मुख्य सुधार है कि हम सब मान अल्पविराम से अलग दिखाने है:

SELECT from1.keys, from1.option_name, from1.Field_M3_name, 

Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2 
    WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values", 

Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2 
    WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting" 

FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list) 
-- WHERE 
) from1 
ORDER BY keys 

ध्यान दें कि हमने सभी संभावित NULL केस समस्याएं हल की हैं जिन्हें मैं सोच सकता हूं और हमने एक त्रुटि भी तय की है जिसे हमें संख्यात्मक मानों (फ़ील्ड सॉर्टिंग) के लिए मिला है।

2

msdn से मूल्यों को जोड़ने के लिए एक SELECT कथन में एक चर का उपयोग न करें (यानी, कुल मानों की गणना करने के लिए)। अप्रत्याशित क्वेरी परिणाम हो सकते हैं।इसका कारण यह है (कार्य भी शामिल है) का चयन करें सूची में सभी भाव प्रत्येक उत्पादन पंक्ति के लिए ठीक एक बार निष्पादित करने के लिए गारंटी नहीं दी जाती

ऊपर है कि संयोजन के रूप में ऊपर किया कहने लगता मान्य नहीं है काम के रूप में अधिक बार किया जा सकता है चुनिंदा

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