【问题标题】: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 逻辑是什么?

【问题讨论】:

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


    【解决方案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"))');
    

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多