3

次の XML があります。

<root>
  <row value="US">
    <col value="00">Jon</col>
    <col value="01">David</col>
    <col value="02">Mike</col>
    <col value="03">Nil</col>
  </row>
  <row value="Canada">
    <col value="C1">Pollard</col>
  </row>
  <row value="Japan">
    <col value="J1">Yin</col>
    <col value="J2">Li</col>
  </row>
  <row value="India">
    <col value="MP">Ram</col>
    <col value="UP">Paresh</col>
    <col value="AP">Mohan</col>
  </row>
</root>

そして、SQL Server クエリを使用して次の出力が必要です。

US  00  Jon
US  01  David
US  02  Mike
US  03  Nil
Canada  C1  Pollard
Japan   J1  Yin
Japan   J2  Li
India   MP  Ram
India   UP  Paresh
India   AP  Mohan

次のSQLクエリを使用しています:

declare @x xml
set @x =
'<root>
  <row value="US">
    <col value="00">Jon</col>
    <col value="01">David</col>
    <col value="02">Mike</col>
    <col value="03">Nil</col>
  </row>
  <row value="Canada">
    <col value="C1">Pollard</col>
  </row>
  <row value="Japan">
    <col value="J1">Yin</col>
    <col value="J2">Li</col>
  </row>
  <row value="India">
    <col value="MP">Ram</col>
    <col value="UP">Paresh</col>
    <col value="AP">Mohan</col>
  </row>
</root>'

select r.value('@value','varchar(100)'),r.value('.','varchar(100)')
from @x.nodes('root') as m(c)
cross apply m.c.nodes('row/col') as x(r)

親行の値を含む最初の列を取得できません。最初の列の値を取得するためにどのような変更を加えることができるか教えてください。

4

2 に答える 2

10

これを試して:

select 
    ParentValue = c.value('(../@value)[1]', 'varchar(100)'),
    ValueAttr = c.value('@value','varchar(100)'),
    ColValue = c.value('.','varchar(100)')
from 
    @x.nodes('/root/row/col') as m(c)

基本的に、使用する必要はまったくありません。呼び出しからノードをCROSS APPLY選択し、使用して親ノード (要素)の属性を取得するだけです。/root/row/col.nodes()../@valuevalue<row>

于 2012-12-25T10:06:46.890 に答える
3

CROSS APPLY を使用するとより効率的です。実行計画を見ると、CROSS APPLY を使用した場合のクエリ コストはわずか 16% であり、CROSS APPLY を使用しない場合は 84% です。CROSS APPLY を使用する私のソリューションは次のとおりです。

select 
T.c.value('@value[1]','varchar(100)') as 'Country'
,T2.col.value('@value[1]','varchar(100)') as 'Col2'
,T2.col.value('data(.)','varchar(100)') as 'Col3'
from 
@x.nodes('/root/row') T(c)       
CROSS APPLY T.c.nodes('col')  as T2(col)
于 2014-09-05T15:45:07.263 に答える