我有一个带有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中实现此实际查询的内容应该是什么。
答案 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
强>