如何将 XML.modify 'replace value' 与 WHERE 子句一起使用
How to use XML.modify 'replace value' with a WHERE clause
我有一个 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
逻辑是什么?
您指定的 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"))');
我有一个 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
逻辑是什么?
您指定的 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"))');