Updating SQL Server XML node

2019-02-28 00:45发布

I am trying to update a node Qty of my XML which is stored inside a SQL Server XML column, no error occurred but my field did not got updated.

Please advice. Thanks.

XML data copied from SQL Server xml column:

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

Stored procedure:

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

2条回答
Evening l夕情丶
2楼-- · 2019-02-28 01:10

You're ignoring the root level node <ArrayOfCampaignVoucher> - try this:

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 
查看更多
forever°为你锁心
3楼-- · 2019-02-28 01:10

Or, you could do the following, assuming SQL Server supports the descendent-or-self axis, and assuming that Qty has no other ancestors:

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

But it seems like you have multiple CampaignVoucher nodes per Array, and that you wouldn't want to wholesale replace the first instance of a value with a new value. Instead, wouldn't you want to restrict the update to a voucher with a specific VouCode?

查看更多
登录 后发表回答