1

QtySQL Server XML列内に格納されているXMLのノードを更新しようとしていますが、エラーは発生しませんでしたが、フィールドが更新されませんでした。

ご意見をお聞かせください。ありがとう。

SQL Server xml列からコピーされたXMLデータ:

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

ストアドプロシージャ:

USE [c1]
GO
/****** Object:  StoredProcedure [dbo].[Campaign_InsertRewardsVoucher]    Script Date: 10/22/2011 23:33:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
*/
ALTER PROCEDURE [dbo].[Campaign_InsertRewardsVoucher]  

    @voucherXML         XML, -- @voucherXML is the XML pass from my SQL server 

AS  
BEGIN

declare @changedVal int
set @changedVal = 4 

UPDATE  [Customers] 
SET  voucherXML.modify('replace value of (/CampaignVoucher/Qty/text())[1] with "0"') 
WHERE  voucherXML.value('(/CampaignVoucher/Qty)[1]', 'int') = @changedVal 


END
4

2 に答える 2

2

ルートレベルのノードを無視しています<ArrayOfCampaignVoucher>-これを試してください:

UPDATE 
   dbo.[Customers] 
SET 
   voucherXML.modify('replace value of (/ArrayOfCampaignVoucher/CampaignVoucher/Qty/text())[1] with "0"') 
WHERE  
   voucherXML.value('(/ArrayOfCampaignVoucher/CampaignVoucher/Qty)[1]', 'int') = @changedVal 
于 2011-10-22T17:53:06.580 に答える
0

または、SQL Serverが子孫軸または自己軸をサポートし、Qtyに他の祖先がないと仮定して、次のことを行うことができます。

UPDATE 
  dbo.[Customers] 
SET 
  voucherXML.modify('replace value of (//Qty/text())[1] with "0"') 
WHERE  
  voucherXML.value('(//Qty)[1]', 'int') = @changedVal 

しかし、配列ごとに複数のCampaignVoucherノードがあり、値の最初のインスタンスを新しい値に大規模に置き換えたくないようです。代わりに、更新を特定のVouCodeを持つバウチャーに制限しませんか?

于 2011-10-23T16:13:35.870 に答える