2012-11-15 10 views
5

Ecco l'XML:T-SQL e XML - genitore concatenare e figlio più elementi in set di risultati

<?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> 

Usando questo XML e all'interno di una singola istruzione SELECT in una stored procedure SQL Server, vorrei creare un set di risultati che assomiglia a questo:

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

ogni record nel set di risultati contiene una colonna per la <Car><Group>group</Group></Car> e un'altra colonna per la concatenazione di ogni <Insurances><Optional><Code>code</Code></Optional></Insurances>.

È possibile?

risposta

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 -> sono imbattuto in questo mentre la ricerca di aiuto - ho fatto piccoli aggiustamenti e risolto il mio problema .. ora è solo che funziona ma non lo capisco affatto! In ogni caso, grazie @mikaeleriksson – Busy

1

Prova questo

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] 

Risultato

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