如何使用XML.modify'替换值'使用WHERE子句

时间:2015-03-20 09:01:16

标签: xml tsql sql-server-2012 dml xml-dml

我有一个XML列,其中包含存储在XML中的外键ID值。我需要能够在ID值更改时更新XML(例如,将" 26"的所有实例更改为" 999")。

从我的阅读here我尝试调整代码,但它实际上并没有更新:

DECLARE @tmp TABLE (xmlCol xml);

INSERT INTO @tmp (xmlCol) SELECT 
('<search><groups><g id="25" /><g id="26" /></groups></search>') UNION ALL SELECT
('<search><groups><g id="2" /><g id="9" /></groups></search>') UNION ALL SELECT
('<search><groups><g id="7" /><g id="12" /><g id="26" /></groups></search>');

SELECT * FROM @tmp;

DECLARE @oldId int = 26;
DECLARE @newId int = 999;

UPDATE @tmp SET xmlCol.modify('replace value of 
    (/search/groups/g/text()[.=(sql:variable("@oldId"))])[1]
with 
    (sql:variable("@newId"))');

SELECT * FROM @tmp;

要实现这一目标的正确modify逻辑是什么?

1 个答案:

答案 0 :(得分:3)

您指定的XPath将值与元素g的文本匹配,并且适用于<g>26</g>之类的元素,在您的情况下,您必须更改XPath以匹配元素的id属性。假设组在/search/groups内是唯一的,您可以尝试下面的内容:

UPDATE @tmp
SET xmlCol.modify('replace value of 
    (/search/groups/g[@id=sql:variable("@oldId")]/@id)[1]
with 
    (sql:variable("@newId"))');