我刚刚发现(必要时)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)
问题:
答案 0 :(得分:7)
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
个。{/ p>
value()
返回XPath
表达式相对于上一步返回的节点的值。
由于您想要返回相关节点的属性值,因此您只需在属性名称前加上@
(它告诉您需要子属性,而不是子节点)。 / p>