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)
我无法获得包含父行值的第一列.您能否建议我为获得第一列价值而做出哪些改变?
试试这个:
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>元素)