5

这是 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>

使用此 XML 并在 SQL Server 存储过程中的单个 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

2 回答 2

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)
于 2012-11-15T13:42:35.827 回答
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
于 2012-11-15T04:35:23.220 回答