我刚刚发现(必要时)TSQL具有一些从包含XML的列中提取数据的功能.我有一个包含XML数据的Sql Server列(尽管列类型不是xml ...它是varchar).我应该从列中提取数据的子集.简化的条目看起来像这样:
declare @Table as table(id char(1), datacolumn xml)
insert into @table
select 'a', '<root><vnode v="5" /><vnode v="8" /></root>'
insert into @table
select 'b', '<root><vnode v="7" /></root>'
id   datacolumn
---  -----------------------------------------
a    <root><vnode v="5" /><node v="8" /></root>
b    <root><vnode v="7" /></root>
所以,我想提出一个可以返回以下内容的查询:
id   data
---  ----
a    5
a    8
b    7
我已经达到了能够获得一些信息的程度......但我错过了一些概念.
select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)
问题:
SELECT  id, T.c.value('@v', 'NVARCHAR(MAX)')
FROM    @table
CROSS APPLY
        datacolumn.nodes('/root/vnode') AS T(c)
在datacolumn.nodes('/root/vnode')返回的所有实例/root/vnode每个XML.
还有2那些在a和1中b.
value()返回XPath表达式相对于上一步返回的节点的值.
由于您希望返回相关节点的属性值,因此您只需在属性名称前面添加一个@(告知您需要子属性,而不是子节点).
| 归档时间: | 
 | 
| 查看次数: | 10972 次 | 
| 最近记录: |