在Sql Server列中从XML中提取数据

时间:2010-01-27 15:38:19

标签: xml tsql

我刚刚发现(必要时)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)

问题:

  1. 这将获取vnode中的值(为空),但我需要标记为“v”的属性的值。
  2. 另外,因为我已经[1],所以我得到了第一个节点......但是我想要所有这些节点......但是还没有理解这个概念。

1 个答案:

答案 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中的a1中有b个。{/ p>

value()返回XPath表达式相对于上一步返回的节点的值。

由于您想要返回相关节点的属性值,因此您只需在属性名称前加上@(它告诉您需要子属性,而不是子节点)。 / p>