T-SQL和XML - 将父元素和多个子元素连接到结果集中

rst*_*ppi 5 xml t-sql sql-server-2008 xml-parsing

这是XML:

<?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>
Run Code Online (Sandbox Code Playgroud)

使用此XML并在SQL Server存储过程中的单个SELECT语句中,我想创建一个如下所示的结果集:

Group           Codes
--------------------------
ECMR            BE,BF,I,LD
CDMR            BG,BA,IS,LS
Run Code Online (Sandbox Code Playgroud)

结果集中的每个记录都包含一列<Car><Group>group</Group></Car>和另一列用于每个记录的串联<Insurances><Optional><Code>code</Code></Optional></Insurances>.

这可能吗?

Mik*_*son 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)
Run Code Online (Sandbox Code Playgroud)