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 ストアド プロシージャの 1 つの 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 に答える