带有Where子句的XML节点更新

时间:2015-07-18 18:36:26

标签: sql-server xml

我有一个带有XML列的表。以下是XML列的示例数据

         <ColItem>
             <Item>
                <Name>ItemA</Name>
                <Price>100</Price>
             </Item>
             <Item>
                <Name>ItemB</Name>
                <Price>200</Price>
             </Item>
             <Item>
                <Name>ItemC</Name>
                <Price>300</Price>
             </Item>
        </ColItem>

我想更新&#39; ItemA&#39;与&#39; ItemNewA&#39;在节点中。对于具有Item&#39; ItemA&#39;。

的所有行,应检查并更新此项

伪查询

更新Tbl 使用&#39; ItemNewA&#39;设置XmlCol.Modify(&#39; ItemA&#39;) XMLCol.Has(&#39; ItemA&#39;)

在SQL Server中实现此实际查询的内容应该是什么。

1 个答案:

答案 0 :(得分:2)

您可以使用SQL Server XML Data Modification Language更新XML列,特别是使用replace value of命令。然后对于where子句,使用XML方法exist()=1

UPDATE Tbl 
SET XmlCol.modify('replace value of (/ColItem/Item/Name/text()[.="ItemA"])[1] with "ItemNewA"')
WHERE XmlCol.exist('/ColItem/Item/Name/text()[.="ItemA"]')=1

<强> Sqlfiddle Demo

更新:

这是在XPath / XQuery中使用SQL变量的示例:

DECLARE @old VARCHAR(10) = 'ItemA'
DECLARE @new VARCHAR(10) = 'ItemNewA'

UPDATE Tbl 
SET XmlCol.modify('
    replace value of (/ColItem/Item/Name/text()[.=sql:variable("@old")])[1] 
    with sql:variable("@new")
')
WHERE XmlCol.exist('/ColItem/Item/Name/text()[.=sql:variable("@old")]')=1;

<强> Sqlfiddle Demo