交叉应用以从SQL Server中的Xml获取子父值

Par*_*esh 1 t-sql sql-server sqlxml sql-server-2008 cross-apply

我有以下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>
Run Code Online (Sandbox Code Playgroud)

我希望通过使用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
Run Code Online (Sandbox Code Playgroud)

我正在使用以下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)
Run Code Online (Sandbox Code Playgroud)

我无法获得包含父行值的第一列.您能否建议我为获得第一列价值而做出哪些改变?

mar*_*c_s 8

试试这个:

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

基本上,根本不需要使用CROSS APPLY- 只需/root/row/col.nodes()调用中选择节点,并使用../@value获取value父节点上的属性(<row>元素)

  • @Paresh:如果这个答案帮助你解决问题,你应该[**接受这个答案**](http://meta.stackexchange.com/q/5234/153998).这将表达您对那些花时间帮助您*的人们的感激之情. (2认同)
  • 很有帮助!../@value建议有助于减少CROSS'es :). (2认同)