2012-11-15 16 views
5

İşte XML set sonuç kümesindeki her kayıt <Car><Group>group</Group></Car> için bir sütun ve her <Insurances><Optional><Code>code</Code></Optional></Insurances> bir Ulama için başka bir sütun içerenT-SQL ve XML sonucu içine concatenate ebeveyn ve çoklu alt öğeleri

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

: şöyle bir sonuç kümesi oluşturmak.

Bu mümkün mü?

cevap

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 deneyin -> yardım arayan bu süre rastladım - i küçük ayarlamalar yapılmış ve bu benim sorun çözüldü .. şimdi sadece işe yarıyor ama ben hiç anlamıyorum! Her şeye rağmen, teşekkürler mikaeleriksson – Busy

1

bu

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] 

Sonucu

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