如何使用带有 WHERE 子句的 XML.modify 'replace value'

Posted

技术标签:

【中文标题】如何使用带有 WHERE 子句的 XML.modify \'replace value\'【英文标题】:How to use XML.modify 'replace value' with a WHERE clause如何使用带有 WHERE 子句的 XML.modify 'replace value' 【发布时间】:2015-05-23 15:25:44 【问题描述】:

我有一个 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】:

您指定的 XPath 将值与元素 g 的文本匹配,并且适用于像 &lt;g&gt;26&lt;/g&gt; 这样的元素,在您的情况下,您必须更改 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"))');

【讨论】:

以上是关于如何使用带有 WHERE 子句的 XML.modify 'replace value'的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有过滤器 where 子句的 oracle 外连接

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

带有获取下一行的 Where 子句

带有插入语句的 Where 子句

如何在带有 select 语句的 where 子句中使用比较运算符?

如何编写带有子查询的 Django 查询作为 WHERE 子句的一部分?