में श्रृंखलाबद्ध परिणाम मैं एक एसक्यूएल समारोह है कि इस कोड को भी शामिल किया है।एसक्यूएल क्वेरी एक स्ट्रिंग
स्पष्ट रूप से सी # कोड में एक फोरच लूप ऐसा करेगा, लेकिन मैं इसे एसक्यूएल में कैसे कर सकता हूं?
में श्रृंखलाबद्ध परिणाम मैं एक एसक्यूएल समारोह है कि इस कोड को भी शामिल किया है।एसक्यूएल क्वेरी एक स्ट्रिंग
स्पष्ट रूप से सी # कोड में एक फोरच लूप ऐसा करेगा, लेकिन मैं इसे एसक्यूएल में कैसे कर सकता हूं?
यदि आप 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
पहला वर्ण, उदा पर एक "कुछ भी नहीं" चरित्र डालता है आपको वह परिणाम देने के लिए "अनावश्यक" पहले कॉमा को मिटा देता है, जिसे आप शायद ढूंढ रहे हैं।
अद्यतन: ठीक है - मैं टिप्पणी नहीं समझते हैं - अगर डेटाबेस तालिका में अपने पाठ को पहले से ही <
, >
या &
, तो मेरे वर्तमान समाधान की तरह वर्ण हैं वास्तव में <
, >
, और &
में उन सांकेतिक शब्दों में बदलना होगा ।
यदि आपको उस XML एन्कोडिंग में कोई समस्या है - तो हाँ, आपको @KM द्वारा प्रस्तावित समाधान को देखना चाहिए जो उन पात्रों के लिए भी काम करता है। चेतावनी से एक शब्द: यह दृष्टिकोण बहुत अधिक संसाधन और प्रसंस्करण गहन है - बस इतना ही आपको पता है।
** यह एक्सएमएल विशेष पात्रों ('<', '&' , '>', आदि) ** को मेरे पिछले उत्तर की तरह ठीक तरह से संभाल नहीं पाएगा, यहां देखें: http://stackoverflow.com/questions/5031204/does-t-sql-have-an -ग्रेगेट-फ़ंक्शन-टू-कॉन्सटेनेट-स्ट्रिंग्स/5031297 # 5031297 –
@marc_s यह खतरनाक है। मुझे ऊपर केएम की टिप्पणी गूंजनी होगी। – jnm2
@ जेएनएम 2: सहमत - ** अगर ** किसी को उन विशेष पात्रों की आवश्यकता है, तो "केएम" द्वारा समाधान जाने का तरीका है। ** कैसे: ** यह ** बहुत कम ** अधिक प्रसंस्करण गहन है और इस प्रकार मैं इसे केवल ** ** ** का उपयोग करने की अनुशंसा करता हूं यदि आपके पास वास्तव में आपके आउटपुट –
DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''
SELECT @[email protected]+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString
@ AlexanderMP के जवाब सही है, लेकिन आप यह भी coalesce
साथ nulls से निपटने पर विचार कर सकते हैं:
declare @CodeNameString nvarchar(max)
set @CodeNameString = null
SELECT @CodeNameString = Coalesce(@CodeNameString + ', ', '') + cast(CodeName as varchar) from AccountCodes
select @CodeNameString
हां, मैं कोलेस/इज़नल के बारे में भूल गया। लेकिन क्या यह @ कोडनाम नाम 'की बजाय' कोडनाम 'की जांच करने के लिए बेहतर समझ नहीं लेगा? कोई इस तरह से डेटा खो सकता है। अभी तक बेहतर, कोयलेस्टे के बजाय, यह सादे पुराने 'जहां कोडनाम शून्य नहीं है' का उपयोग करने के लिए समझ में आता है। – AlexanderMP
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
100 थोड़ा छोटा है, आपको नहीं लगता कि ;-) –
@ James- Hmm..just की नकल की है कि ओपी के प्रश्न को अद्यतन किया है से यह now..thanks ... btw यह डांग तुम मुझे यह करने के लिए हराया था .. – Vishal
यहां एक और वास्तविक जीवन उदाहरण है जो कम से कम 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
केस समस्याएं हल की हैं जिन्हें मैं सोच सकता हूं और हमने एक त्रुटि भी तय की है जिसे हमें संख्यात्मक मानों (फ़ील्ड सॉर्टिंग) के लिए मिला है।
msdn से मूल्यों को जोड़ने के लिए एक SELECT कथन में एक चर का उपयोग न करें (यानी, कुल मानों की गणना करने के लिए)। अप्रत्याशित क्वेरी परिणाम हो सकते हैं।इसका कारण यह है (कार्य भी शामिल है) का चयन करें सूची में सभी भाव प्रत्येक उत्पादन पंक्ति के लिए ठीक एक बार निष्पादित करने के लिए गारंटी नहीं दी जाती
ऊपर है कि संयोजन के रूप में ऊपर किया कहने लगता मान्य नहीं है काम के रूप में अधिक बार किया जा सकता है चुनिंदा
द्वारा लौटाई गई पंक्तियों की तुलना में SQL सर्वर का ** संस्करण ** क्या है ?? की –
संभव डुप्लिकेट [एसक्यूएल सर्वर: मैं एक स्तंभ में एकाधिक पंक्तियाँ परिसीमित अल्पविराम कर सकते हैं?] (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 –
कई बार जवाब दिया ... लेकिन देखो बाहर, नहीं सभी XML पथ के लिए concatenations कार्यान्वयन ठीक से पिछले एक जवाब देने के लिए मेरा उत्तर की तरह एक्सएमएल विशेष वर्ण (<, &, >, आदि) संभाल लेंगे होगा: http://stackoverflow.com/questions/5031204/does-t-sql-have- एक-समेकित-फ़ंक्शन-टू-कॉन्सटेनेट-स्ट्रिंग्स/5031297 # 5031297 –