2011-11-01 56 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