将子节点从SQL xml变量插入另一个xml变量

时间:2016-07-22 08:17:50

标签: sql-server xquery nodes

我有两个xml变量:

@main xml = '<root></root>'
@insert xml = '<rows><row>SomeRow</row></rows>'

我想插入@insert行的子节点,以便我得到一个如下所示的结果XML:

<root>
   <row>SomeRow</row>
</root>

我很清楚从sql变量中插入xml(使用sql:variable(“@ insert”)),但这会插入包含根元素的整个XML。我想要的是只在@insert变量中插入根元素的子节点。

非常感谢。

2 个答案:

答案 0 :(得分:3)

一种方法是更改​​需要插入另一个xml的变量中的数据:

DECLARE @main xml = '<root></root>',
        @insert xml = '<rows><row>SomeRow</row></rows>'

SELECT @insert = @insert.query('/rows/row')

SET @main.modify('             
insert sql:variable("@insert")             
into (/root)[1] ')             
SELECT @main 

输出:

<root>
  <row>SomeRow</row>
</root>

答案 1 :(得分:0)

好的,本着结束这个的精神,我有一个技术上可以用来做我想要的单线的解决方法。它已被证明对我有效,并避免创建一个中间变量。但也只适用于主要的单级XML。

-- The same variables, I added '<tag>' to demonstrate the insert
DECLARE @main xml = '<root><tag>Some data Here</tag></root>'
DECLARE @insert xml = '<rows><row>SomeRow</row></rows>'

-- One-liner that inserts '@insert' into @main 
SET @main = (
             SELECT @main.query('/root/*'), @insert.query('/rows/*') 
             FOR XML RAW(''),ROOT('root'), ELEMENTS, TYPE
             )
SELECT @main

输出:

<root>
  <tag>Some data Here</tag>
  <row>SomeRow</row>
</root>