使用XML字段插入以获取子元素的所有值?

时间:2011-11-01 19:09:09

标签: sql xml tsql

我有一个包含XML字段的表。 XML Field的Schema与此类似......

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

我知道如何使用这个获得第一个,第二个,Nth SomeValue ...

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

我正在尝试使用Insert Into语句将所有SomeValue节点值放入表中。问题是每个父母可能有多个子元素,我只知道如何一次抓取一个。有没有一种简单的方法来实现这一点而不需要循环逻辑? (每个SomeValue值应该是我插入的表中的自己的记录。)

额外信用:我展示的示例从单个XML Field的第一个Child元素获取第一个SomeValue值。如果您能够提出一个解决方案,不仅可以从单个记录的字段中获取所有SomeValue值,而且可以获取表中每个记录中该字段的所有SomeValue值,那么您的答案将会非常有用。

2 个答案:

答案 0 :(得分:1)

这将使您在所有子节点中获得所有第一个SomeValue:

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

但是如果在同一个子节点中有2个SomeValue

,则不确定如何操作

答案 1 :(得分: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)

结果:

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