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

Bes*_*ska 3 xml t-sql

我刚刚发现(必要时)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>
Run Code Online (Sandbox Code Playgroud)

所以,我想提出一个可以返回以下内容的查询:

id   data
---  ----
a    5
a    8
b    7
Run Code Online (Sandbox Code Playgroud)

我已经达到了能够获得一些信息的程度......但我错过了一些概念.

select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这将获取vnode中的值(为空),但我需要标记为"v"的属性的值.
  2. 另外,因为我已经[1]在那里,我正在获得第一个节点......但是我想要所有这些节点......但是还没有弄清楚这个概念.

Qua*_*noi 7

SELECT  id, T.c.value('@v', 'NVARCHAR(MAX)')
FROM    @table
CROSS APPLY
        datacolumn.nodes('/root/vnode') AS T(c)
Run Code Online (Sandbox Code Playgroud)

datacolumn.nodes('/root/vnode')返回的所有实例/root/vnode每个XML.

还有2那些在a1b.

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

由于您希望返回相关节点的属性值,因此您只需在属性名称前面添加一个@(告知您需要子属性,而不是子节点).