2015-03-20 6 views
4

У меня есть столбец XML, который содержит значения идентификатора внешнего ключа, хранящиеся в XML. Мне нужно обновить XML при изменении значения ID (например, изменить все экземпляры «26» на «999»).Как использовать XML.modify 'replace value' с предложением WHERE

Из моих показаний 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 логика для достижения этой цели, пожалуйста?

ответ

3

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"))');