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

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

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

来 self 的阅读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;

请问实现此目的的正确修改逻辑是什么?

最佳答案

您指定的 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 - 如何使用带有 WHERE 子句的 XML.modify 'replace value',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29162811/

相关文章:

xml - 条件依赖注入(inject)

asp.net-mvc-4 - 将 MVC 4 SimpleMembership 与现有的数据库优先 EF 模型结合使用

windows-server-2008 - SSMS 2012 无法加载数据库

xml - 在 Wiremock 中评估返回 bool 值的表达式 - 请求匹配条件

java - Android 应用程序在 startActivity() 上崩溃

xml - 在SQL Server中,xml数据保存在一个text列中,如何从这个列中查询?

sql-server - 创建结构类型作为 T-SQL 的列值?

sql-server - 批量插入 - 捕获所有约束错误

asp.net - 无法将 ASP.NET 数据库附加到 SQL Server Management Studio

java - 不允许实体声明但允许 DTD