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 回答