2010-01-27 76 views
3

我刚才发现(必要时)TSQL具有一些功能,可以从包含XML的列中提取数据。我有一个包含XML数据的Sql Server列(尽管列类型不是xml ...它是varchar)。我应该从列中提取一部分数据。简化条目将是这个样子:在Sql Server列中从XML中提取数据

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. 这将让我这个虚拟节点(里面是空的),里面的价值,但我需要的属性,标有“V”的值。因为我在那里[1],所以我得到了第一个节点......但我想要所有这些节点......但还没有为这个概念提供帮助。

回答

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

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

a1b中有2

value()返回一个XPath表达式相对于上一步返回的节点的值。因为你想要返回有问题的节点属性的值,所以你需要在属性名前面加上@(它告诉你需要一个子属性而不是子节点)。

+0

我知道这应该是简单的,我会错过一些基本的东西!谢谢! – Beska 2010-01-27 15:54:50