从Sql Server列中的XML提取数据
我刚刚发现(出于必要),TSQL具有一些从包含XML的列中提取数据的功能。我有一个Sql Server列,其中包含XML数据(尽管列类型不是XML,而是varchar)。我应该从列中提取数据的一个子集。简化的条目如下所示:从Sql Server列中的XML提取数据,xml,tsql,Xml,Tsql,我刚刚发现(出于必要),TSQL具有一些从包含XML的列中提取数据的功能。我有一个Sql Server列,其中包含XML数据(尽管列类型不是XML,而是varchar)。我应该从列中提取数据的一个子集。简化的条目如下所示: declare @Table as table(id char(1), datacolumn xml) insert into @table select 'a', '<root><vnode v="5" /><vnode v="8" />
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>
我已经到了能够获得一些信息的地步……但是我缺少一些概念
select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)
问题:
datacolumn.nodes('/root/vnode')
返回每个XML
的/root/vnode
的所有实例
在a
中有2个,在b
中有1个
value()
返回相对于上一步返回的节点的XPath
表达式的值
由于要返回所讨论节点的属性值,只需在属性名称前面加上一个@
(这表明您想要的是子属性,而不是子节点)。我知道这应该很简单,而且我会缺少一些基本的东西!谢谢
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)