2010-01-27 79 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