Обновление атрибута XML в столбце XML SQL Server - PullRequest
2 голосов
/ 23 октября 2011

Я пытаюсь обновить узел в моем XML, который хранится в столбце XML SQL Server, строка ниже работает, если мой XML находится в элементе XML, но теперь мне как-то нужно изменить его на атрибуты XML, по-видимому,строка становится недействительной после изменения.

Работает для XMLElement:

UPDATE  [Customers] 
SET  voucherXML.modify('replace value of (/ArrayOfCampaignVoucher/CampaignVoucher/Qty/text())[1] with "50"') 
WHERE  voucherXML.value('(/ArrayOfCampaignVoucher/CampaignVoucher/VouCode)[1]', 'nvarchar(50)') = @VoucherCode 

Я пытался изменить выражение, как это, но не повезло, нет ошибок, но значения QTY не получают изменениязначение @NewQuantity:

UPDATE [Customers]  
       SET voucherXML='<ArrayOfCampaignVoucher xmlns:xsd="http://www.w3.org/2001/XMLSchema" Qty="' + CAST(@NewQuantity AS NVARCHAR(16)) + '" />'  
   WHERE voucherXML.value('(/CampaignVoucher/VouCode)[1]', 'nvarchar(50)') = @VoucherCode 

Вот так выглядит мой XML в столбце XML SQL Server:

<ArrayOfCampaignVoucher xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CampaignVoucher VouCode="Vouc001" Qty="16" />
  <CampaignVoucher VouCode="Vouc002" Qty="18" />
  <CampaignVoucher xsi:nil="true" />
</ArrayOfCampaignVoucher>

1 Ответ

7 голосов
/ 23 октября 2011

Вы должны использовать функции XQuery, а не связывать вместе ваш XML, как это ....

Попробуйте вместо этого:

DECLARE @newquantity INT = 55

UPDATE dbo.Customers
SET voucherXML.modify('replace value of (/ArrayOfCampaignVoucher/CampaignVoucher[@VouCode="Vouc002"]/@Qty)[1] with sql:variable("@NewQuantity") ')

Это работает для меня - атрибут Qtyузла с VouCode="Vouc002" обновляется до значения, определенного ранее в переменной SQL

Обновление: , чтобы вставить новую запись <CampaignVoucher>, используйте XQuery примерно так:

UPDATE dbo.Customers
SET voucherXML.modify('insert <CampaignVoucher VouCode="Vouc003" Qty="42" /> 
                       as last into (/ArrayOfCampaignVoucher)[1]')
...