Изменить XML в поле SQL, хранящемся как Varbinary - PullRequest
0 голосов
/ 18 октября 2018

Мой XML хранится в поле как varbinary.

SELECT  cast (inboxXml as xml) FROM globalDB.Inbox WHERE inboxCId = '207435-N'

Я хотел бы обновить один атрибут (ниже).Однако ошибка «Невозможно вызвать методы в varbinary (max)».Я пробовал разные способы разыграть его, но не могу его найти.

спасибо,

;WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema')
UPDATE globalDB.Inbox
SET inboxXml.modify('replace value of (//ReceiveDeliveryHeader/DocumentID/ID/@accountingEntity[.="ABC"])[1] with "ZZZ"')
WHERE inboxCId = '207435-N'

1 Ответ

0 голосов
/ 18 октября 2018

Первый вопрос: почему вы храните 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...