2012-11-15 22 views
5

Đây là XML:T-SQL và XML - mẹ concatenate và nhiều đứa trẻ yếu tố vào kết quả thiết

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

Sử dụng XML này và chỉ trong một câu lệnh SELECT duy nhất trong một thủ tục SQL Server lưu trữ, tôi muốn tạo ra một tập kết quả trông như thế này:

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

mỗi bản ghi trong tập kết quả chứa một cột cho <Car><Group>group</Group></Car> và cột khác cho nối của mỗi <Insurances><Optional><Code>code</Code></Optional></Insurances>.

Điều này có khả thi không?

Trả lời

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 -> đi qua trong khi điều này tìm kiếm sự giúp đỡ - tôi đã thực hiện điều chỉnh nhỏ và nó giải quyết vấn đề của tôi .. bây giờ nó chỉ là nó hoạt động nhưng tôi không hiểu nó ở tất cả! Bất kể, cảm ơn bạn @mikaeleriksson – Busy

1

Hãy thử điều này

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] 

quả

Group Codes 
ECMR BE,BF,I,LD 
CDMR BA,BG,IS,LS 
Các vấn đề liên quan