2010-12-07 11 views
5

मैं एक xml स्तंभ में संग्रहीत एक डेटा है और बच्चे नोड्स के एक अल्पविराम द्वारा पृथक सूची की जरूरत है। नीचे लिपि का उपयोग करके, मुझे केवल "ए बी सी" मिल सकता है। कृपया xquery का उपयोग करके "ए, बी, सी" प्राप्त करने में मेरी सहायता करें (अल्पविराम के साथ अंतरिक्ष की सरल प्रतिस्थापन मदद नहीं करता है क्योंकि हमारे पास रिक्त स्थान के साथ डेटा है)।एसक्यूएल सर्वर स्तंभ से एक्सएमएल नोड्स जाओ के रूप में अल्पविराम से अलग किए

create table Temp12345 (col1 xml) 
go 

insert into Temp12345 (col1) 
values('<fd><field i="22"><v>A</v><v>B</v><v>C</v></field></fd>') 
go 

select col1.value('(/fd/field[@i=22])[1] ', 'NVarchar(Max)') 
from Temp12345 
go 

drop table Temp12345 
go 

उत्तर

8

इस प्रयास करें:

SELECT 
    STUFF((SELECT 
       ',' + fd.v.value('(.)[1]', 'varchar(10)') 
      FROM 
       Temp12345 
      CROSS APPLY 
       col1.nodes('/fd/field/v') AS fd(v) 
      FOR XML PATH('') 
     ), 1, 1, '') 

यह मैं A,B,C देता है - यह भी आप के लिए काम करता है?

+0

एक काम कर जवाब के लिए +1। जिज्ञासा से, मुझे लगता है कि आप क्रॉस आवेदन का उपयोग कर रहे हैं। मैंने सीटीई के साथ कुछ ऐसा किया है। क्या दृष्टिकोण के लिए कोई महत्वपूर्ण लाभ है? – IamIC

+0

@IanC: यकीन नहीं - अपने CTE देखने के लिए :-) कि अभी जिस तरह मैं जानता हूँ कि मैं पंक्ति के एक "छद्म तालिका" में एक्सएमएल नोड्स की एक सूची "चूरे" सकते हैं, यह से अलग-अलग बिट्स और टुकड़े हड़पने के लिए है के लिए होता है । –

+0

@marc एक ही एप्लीकेशन नहीं है, लेकिन यह एक्सएमएल को इसी तरह से पूछता है: टी एएस के साथ ( \t \t \t SELECT \t x.node.value ('fn: local-name (।)', 'वर्कर (50) ') के रूप में RankItem, \t \t \t \t \t x.node.value (' (।) ',' नाव ') के रूप में मूल्य \t \t \t \t से @ xml.nodes ('/डेटा/* ') के रूप में एक्स (नोड) \t \t - जड़ का चयन करें * प्रत्यक्ष * बच्चों 'डेटा' नोड \t \t) \t \t का चयन करें \t @OutOfBounds = काउंट (t.RankItem) \t \t \t से टी अंदरूनी शामिल हों [int] .RankItems के रूप में री पर ri.RankItem = t.RankItem \t \t कहां \t (t.Value <री। [मिन] या टी। वैल्यू> ri। [अधिकतम]) – IamIC

0

एक पूर्ण में शिकायत XQuery प्रोसेसर तुम सिर्फ इस्तेमाल कर सकते हैं:

(/fd/field[@i=22])[1]/string-join(*,',') 
+0

हालांकि SQL सर्वर में काम नहीं करता है। यह त्रुटि 'XQuery वाक्यविन्यास'/फ़ंक्शन() 'समर्थित नहीं है। –

+0

@ मार्टिन: हाँ, लेकिन यहां तक ​​कि' fn: string-join() 'समर्थित नहीं है –

+0

यह' concat' का समर्थन करता है लेकिन मैं नहीं कर सका इसका उपयोग करने का कोई उपयोगी तरीका पता लगाएं। ' 'Concat ((/ fd/क्षेत्र [@ i = 22]) [1],' ',' ')'' 'सिर्फ एबीसी,' –

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