我有一个包含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值,那么您的答案将会非常有用。
答案 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