在SQL Server XML列中更新XML属性

时间:2011-10-23 14:16:13

标签: sql sql-server xml xquery-sql

我正在尝试更新我的XML中存储在SQL Server XML列中的节点,如果我的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在SQL Server XML列中的外观:

<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 个答案:

答案 0 :(得分:7)

你应该使用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]')