【问题标题】:Insert child nodes from an SQL xml variable into another xml variable将 SQL xml 变量中的子节点插入另一个 xml 变量
【发布时间】:2016-11-26 01:35:29
【问题描述】:

我有两个 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 变量中插入根元素的子节点。

非常感谢。

【问题讨论】:

    标签: sql-server xquery nodes


    【解决方案1】:

    一种方法是更改​​需要插入另一个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>
    

    【讨论】:

    • 谢谢gofr1,你是对的,这是我通常做的,但想看看是否有一些语法允许它一口气发生!
    【解决方案2】:

    好的,本着结束这一点的精神,我有一个解决方法,从技术上讲,它是一种可以用来做我想做的事的单线。事实证明,它对我很有效,并且避免了创建中间变量。但也仅适用于主要单级 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多