2014-05-20 81 views
0

給定一個XML列,其數據如下所示,我想編寫一個查詢,其中每個ChangedColumn元素都有一個記錄,並且每個子項都有一個Name/OldValue/NewValue元素。無法查詢每個子節點具有單獨列的xml

DECLARE @t XML = ' 
<ChangeEvent> 
    <ChangedColumn> 
     <Name>MyColumn</Name> 
     <OldValue>SomeOldValue</OldValue> 
     <NewValue>SomeNewValue</NewValue> 
    </ChangedColumn> 
    <ChangedColumn> 
     <Name>SomeOtherColumn</Name> 
     <OldValue>1</OldValue> 
     <NewValue>2</NewValue> 
    </ChangedColumn> 
</ChangeEvent> 
' 

所以結果會是這個樣子......

Name    OldValue  NewValue 
MyColumn   SomeOldValue SomeNewValue 
SomeOtherColumn 1    2 

查詢下面會給我在一列一起搗碎的所有數據,但我想每個子節點的值ChangedColumn元素位於單獨的列中,最好使用與元素名稱匹配的列名稱。

SELECT node.value('.', 'VARCHAR(MAX)') 
FROM @t.nodes('/ChangeEvent/ChangedColumn') t(node) 

任何想法如何解決這個查詢給我需要的結果?

回答

1

你可以在你的.value方法指定節點名稱:

SELECT Name = node.value('Name[1]', 'VARCHAR(MAX)'), 
     OldValue = node.value('OldValue[1]', 'VARCHAR(MAX)'), 
     NewValue = node.value('NewValue[1]', 'VARCHAR(MAX)') 
FROM @t.nodes('/ChangeEvent/ChangedColumn') t(node); 
+0

完美的作品。謝謝! – Jim

0

GarethD的回答可能是更好的,但是當我在等待我也沒搞清楚,另一種方式去了解它,如下所示...

SELECT 
    node.query('./Name') as Name, 
    node.query('./OldValue') as OldValue, 
    node.query('./NewValue') as NewValue 
FROM @t.nodes('/ChangeEvent/ChangedColumn') t(node) 

這包括帶有值的XML標籤,所以我絕對比較喜歡GarethD的答案。不過,我發佈這個以防萬一他們需要看到不止一種方法來解決問題,這可以幫助其他人。

我不知道這種方式的表現是否更差,但我認爲它可能會更糟。

相關問題