我刚刚发现(必然地)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)
问题:
- 这将为我提供 vnode 内的值(它是空的),但我需要标记为“v”的属性的值。
- 另外,因为我在那里有 [1],所以我得到了第一个节点...但我想要所有这些...但还没有理解这个概念。
最佳答案
SELECT id, T.c.value('@v', 'NVARCHAR(MAX)')
FROM @table
CROSS APPLY
datacolumn.nodes('/root/vnode') AS T(c)
datacolumn.nodes('/root/vnode')
返回每个 XML
的 /root/vnode
的所有实例。
a
中有 2
,b
中有 1
。
value()
返回相对于上一步返回的节点的 XPath
表达式的值。
由于您想要返回相关节点的属性值,因此您只需在属性名称前面加上 @
(这表明您想要一个子属性,而不是子节点)。
关于xml - 从 Sql Server 列中的 XML 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148197/