错误使用XML数据类型方法“修改”。在这种情况下,应采用非变数方法

时间:2018-06-20 13:58:33

标签: sql sql-server xml

我正在尝试根据大小写更新表中的XML数据列。下面是我的代码:

UPDATE #temp
SET xml_data = CASE
                  WHEN @type = 'G' 
                     THEN xml_data.modify('insert <type>G</type> after (/Main/name)[1]');
                  WHEN @type = 'Q' 
                     THEN xml_data.modify('insert <type>Q</type> after (/Main/name)[1]'); 
               END

我遇到错误:

  

不正确使用XML数据类型方法“修改”。在这种情况下,应该使用非突变方法。

所需的输出:

  • @type = 'Q'时,将类型节点插入为Q
  • @type = 'G'时,将类型节点插入为G

XML结构:

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

有帮助吗?!

更新:

我编辑的查询:

UPDATE #temp
SET xml_data.modify('insert <Type>{sql:variable("@var")}</Type> after (/Main/name)[1]')

此查询将类型添加到XML的末尾。输出:

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

2 个答案:

答案 0 :(得分:4)

语法为SET [xml_column].modify,不使用分配。不用使用CASE,而是使用特殊的sql:variable函数将变量折叠到更新中:

UPDATE #temp 
SET xml_data.modify('insert <type>{sql:variable("@type")}</type> after (/Main/name)[1]');

答案 1 :(得分:1)

尝试一下:

UPDATE #temp
   SET xml_data = 'insert <type>' + @type + '</type> into (/Main)[1]'

示例:

DECLARE @myXML XML = 
N'<Main>
    <name>John doe</name>    
    <age>15</age>
  </Main>'  ;       

SET @myXML.modify('insert <type>Q</type> into (/Main)[1]') ;  

SELECT @myXML;