2011-11-01 46 views
1

我有一個XML字段的表。該XML字段的架構是類似這樣的東西...插入XML字段以獲取子元素的所有值?

<Root> 
    <Parent> 
    <Child> 
     <SomeValue>1</SomeValue> 
    </Child> 
    <Child> 
     <SomeValue>1</SomeValue> 
    </Child> 
    </Parent> 

我知道如何獲得第一,第二,第N someValue中使用此...

SELECT  
Child.value('(SomeValue)[1]', 'int') 
FROM XMLField.nodes("/Root/Parent/Child[1]") AS N(Child) 

我試圖使用Insert Into語句將所有的SomeValue節點值放入一個表中。問題是每個Parent可能有多個Child元素,我只知道如何一次抓一個。沒有循環邏輯,有沒有簡單的方法來完成這一點? (每個SomeValue值應該是我插入表中的自己的記錄)。

附加題:我發現這個例子會從一個單一的XML字段的第一個子元素的第一someValue中值。如果您能夠想出一個解決方案,不僅可以從單個記錄的字段中獲取所有的SomeValue值,而且可以從表中的每個記錄中的該字段獲取所有的SomeValue值,那麼您的答案會特別有用。

回答

0
declare @T table (XMlField xml) 

insert into @T values 
('<Root> 
    <Parent> 
    <Child> 
     <SomeValue>1</SomeValue> 
    </Child> 
    <Child> 
     <SomeValue>2</SomeValue> 
    </Child> 
    </Parent> 
</Root>') 

insert into @T values 
('<Root> 
    <Parent> 
    <Child> 
     <SomeValue>3</SomeValue> 
    </Child> 
    <Child> 
     <SomeValue>4</SomeValue> 
    </Child> 
    </Parent> 
</Root>') 

select X.N.value('SomeValue[1]', 'int') as SomeValue 
from @T as T 
    cross apply T.XMLField.nodes('/Root/Parent/Child') as X(N) 

結果2 someValue中:

SomeValue 
----------- 
1 
2 
3 
4 
1

這將讓你所有的第一someValue中的所有子節點:

SELECT  
N.rows.value('SomeValue[1]', 'int') 
FROM XMLField.nodes("/Root/Parent/Child") AS N(rows) 

但不知道怎麼做,如果你在同一個子節點

+0

不錯。 +1,因爲這消除了我一次只能選擇一個的問題(每個ChildNode只有一個SomeValue)。如果沒有人能夠回答如何對錶格中的每條記錄進行回答,我會將其設置爲已接受的答案。 – N0Alias