2

SQL Server XML列に格納されている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がSQLServerXML列でどのように見えるかです。

<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>
4

1 に答える 1

8

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]')
于 2011-10-23T14:25:30.367 に答える