Первый вопрос: почему вы храните XML в столбце VARBINARY
?
Это медленно, неуклюже и ошибочно ...
Второе: .modify()
будет работать только с реальным собственным XML .Ни inboxXml.modify()
, ни CAST(inboxXml AS XML).modify()
не будут работать ...
Это еще одна причина изменить тип столбца на XML ...
Попробуйте:
DECLARE @tbl TABLE(ID INT IDENTITY,YourXml VARBINARY(MAX));
DECLARE @SomeXML XML='<root><someNode someAttr="test">content</someNode></root>';
INSERT INTO @tbl VALUES(CAST(@SomeXML AS VARBINARY(MAX)));
- это работает
SELECT ID
,YourXml
,CAST(YourXml AS XML)
FROM @tbl
WHERE ID=1;
- но это не разрешено
UPDATE @tbl SET CAST(YourXml AS XML).modify('replace value of (/root/someNode/@someAttr)[1] with "blah"')
WHERE ID=1
- Что вы можете сделать:
DECLARE @intermediateXML XML= (SELECT CAST(YourXml AS XML) FROM @tbl WHERE ID=1);
SET @intermediateXML.modify('replace value of (/root/someNode/@someAttr)[1] with "blah"');
UPDATE @tbl SET YourXml=CAST(@intermediateXML AS VARBINARY(MAX)) WHERE ID=1;
--voila!
SELECT ID
,YourXml
,CAST(YourXml AS XML)
FROM @tbl
WHERE ID=1;