4

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

从我在这里的阅读中,我尝试调整代码,但实际上并没有更新:

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请问实现这一目标的正确逻辑是什么?

4

1 回答 1

4

您指定的 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"))');
于 2015-03-20T11:53:01.660 回答