使用SQL在XML中插入节点

时间:2018-06-19 20:49:32

标签: sql sql-server xml sql-server-2008

我有以下XML:

create table #temp(cid int,xml_data xml)
insert into cid
values(1001,
     '<Main>
        <name>''John doe''</name>
        <age>15</age>
    </Main>')

我想基于一个简单的参数条件向此XML添加一个附加节点:

所需的输出:

<Main>
    <name>John doe</name>
    <type>Q</type>
    <age>15</age>
</Main>

代码:

select case when @type = 'Q' then
    UPDATE #temp
    SET Main.modify('insert <type = 'Q'> into 
        (/Main)')
    GO

我收到语法错误。任何帮助!

更新:

我在代码中实现了建议的解决方案,但出现错误。错过了一些愚蠢的东西!

 UPDATE #temp
         SET xml_data = 
            case
                when @type = 'G' 
                then xml_data.modify('insert <type>G</type> into (/Main)[1]');
                when @type = 'Q' 
                then xml_data.modify('insert <type>Q</type> into (/Main)[1]'); end

我得到“ XML数据类型方法的错误使用”修改”。在这种情况下,期望使用非突变方法。”错误

2 个答案:

答案 0 :(得分:2)

我能够通过将更新分为两个语句来实现此目的:

create table #temp(cid int,xml_data xml)
insert into #temp
values(1001,
     '<Main>
        <name>''John doe''</name>
        <age>15</age>
    </Main>')


    UPDATE #temp
    SET xml_data.modify('insert <type /> into (/Main)[1]')
    GO

    declare @variable xml = 'q'
    UPDATE #temp
    set xml_data.modify('insert sql:variable("@variable") as last into (/Main/type)[1]')
    GO

    select * from #temp

enter image description here

答案 1 :(得分:2)

不需要任何复杂的麻烦。只需插入所需的节点即可:

UPDATE #temp SET xml_data.modify('insert <type>Q</type> into (/Main)[1]');

使用as firstas lastbefore / after可以指定节点的位置。以下将新节点直接放在<name>之后:

UPDATE #temp SET xml_data.modify('insert <type>Q</type> after (/Main/name)[1]');

UPDATE您有关更新语句的问题

您的陈述有几个缺陷:

UPDATE #temp
     SET xml_data = 
        case
            when @type = 'G' 
            then xml_data.modify('insert <type>G</type> into (/Main)[1]');
            when @type = 'Q' 
            then xml_data.modify('insert <type>Q</type> into (/Main)[1]'); 
         end

您不能使用语法SET xmlColumn = xmlColumn.modify()。您必须使用SET xmlColumn.modify(),而且分号还是会破坏这一点。

说实话,我认为这很复杂,请尝试以下方法:

DECLARE @type VARCHAR(1)='Q'
UPDATE #temp SET xml_data.modify('insert <type>{sql:variable("@type")}</type> into (/Main)[1]');

这将创建一个新节点<type>content</type>,其内容来自变量@type