2012-11-15 17 views
5

यहाँ एक्सएमएल है:T-SQL और एक्सएमएल - परिणाम में CONCATENATE माता-पिता और कई बच्चे तत्वों सेट

<?xml version="1.0" encoding="UTF-16"?> 
<Response> 
    <Offers> 
    <Car> 
     <Group>ECMR</Group> 
    </Car> 
    <Insurances> 
     <Optional> 
     <Code>BE</Code> 
     </Optional> 
     <Optional> 
     <Code>BF</Code> 
     </Optional> 
     <Optional> 
     <Code>I</Code> 
     </Optional> 
     <Optional> 
     <Code>LD</Code> 
     </Optional> 
    </Insurances> 
    </Offers> 
    <Offers> 
    <Car> 
     <Group>CDMR</Group> 
    </Car> 
    <Insurances> 
     <Optional> 
     <Code>BA</Code> 
     </Optional> 
     <Optional> 
     <Code>BG</Code> 
     </Optional> 
     <Optional> 
     <Code>IS</Code> 
     </Optional> 
     <Optional> 
     <Code>LS</Code> 
     </Optional> 
    </Insurances> 
    </Offers> 
</Response> 

इस XML का उपयोग करना और एक एसक्यूएल सर्वर संग्रहीत प्रक्रिया में एक भी SELECT कथन के भीतर, मैं चाहते हैं

Group   Codes 
-------------------------- 
ECMR   BE,BF,I,LD 
CDMR   BG,BA,IS,LS 

परिणाम सेट में प्रत्येक रिकॉर्ड <Car><Group>group</Group></Car> के लिए एक कॉलम और प्रत्येक <Insurances><Optional><Code>code</Code></Optional></Insurances> के संयोजन के लिए एक और स्तंभ शामिल हैं: एक परिणाम के सेट है कि इस तरह दिखता है बनाएँ।

क्या यह संभव है?

उत्तर

4

select T.N.value('(Car/Group/text())[1]', 'varchar(10)') as [Group], 
     (
     select ','+T2.N.value('(./text())[1]', 'varchar(10)') 
     from T.N.nodes('Insurances/Optional/Code') as T2(N) 
     for xml path(''), type 
     ).value('substring(./text()[1], 2)', 'varchar(100)') as Codes 
from @XML.nodes('/Response/Offers') as T(N) 
+0

+1 -> सहायता की खोज इस जबकि भर में आया था - मैं छोटे समायोजन कर दिया और यह मेरी समस्या हल .. अब यह सिर्फ यह काम करता है लेकिन मैं इसे बिल्कुल समझ में नहीं आता! भले ही, धन्यवाद @ mikaeleriksson – Busy

1

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

DECLARE @x XML 
SELECT @x = N'<?xml version="1.0" encoding="UTF-16"?> 
<Response> 
    <Offers> 
    <Car> 
     <Group>ECMR</Group> 
    </Car> 
    <Insurances> 
     <Optional> 
     <Code>BE</Code> 
     </Optional> 
     <Optional> 
     <Code>BF</Code> 
     </Optional> 
     <Optional> 
     <Code>I</Code> 
     </Optional> 
     <Optional> 
     <Code>LD</Code> 
     </Optional> 
    </Insurances> 
    </Offers> 
    <Offers> 
    <Car> 
     <Group>CDMR</Group> 
    </Car> 
    <Insurances> 
     <Optional> 
     <Code>BA</Code> 
     </Optional> 
     <Optional> 
     <Code>BG</Code> 
     </Optional> 
     <Optional> 
     <Code>IS</Code> 
     </Optional> 
     <Optional> 
     <Code>LS</Code> 
     </Optional> 
    </Insurances> 
    </Offers> 
</Response>' 

;With CTE AS(
SELECT 
    X.value('Group[1]' ,'varchar(15)') As [Group],  
    Y.value('Code[1]' ,'varchar(15)') AS [Codes] 
FROM 
@x.nodes('//Response/Offers/Car') T(X) 
CROSS APPLY X.nodes('../Insurances/Optional') U(Y)) 

Select 
    [Group] 
    , [Codes] = Stuff((Select ',' + CAST([Codes] AS vARCHAR(MAX)) 
     FROM CTE c2 
     WHERE c2.[Group] = c1.[Group] 
     FOR XML PATH('') 
    ),1,1,'') 
From CTE c1 
Group By c1.[Group] 

परिणाम

Group Codes 
ECMR BE,BF,I,LD 
CDMR BA,BG,IS,LS