2011-10-23 116 views
2

我想更新XML中存储在SQL Server XML列中的一个节点,如果我的XML位于XML元素中,但是现在我以某种方式需要将其更改为XML属性,显然该行在更改后变为无效。在SQL Server 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> 
+0

删除了'asp.net','c#'和'vb.net'标记 - 与任何这些技术无关,真的.. –

回答

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") ') 

这对我的作品 - 节点与VouCode="Vouc002"Qty属性被更新为价值我在一个SQL变量之前定义

更新:插入新的<CampaignVoucher>项,使用XQuery这样的事情:

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

感谢您的帮助,请您提供一个示例插入一个新的属性:添加VouCode和Quantity的另一行,以及删除基于VouCode的属性。我正尝试寻找有关这方面的教程,但运气不大。谢谢! – k80sg

+0

@ user415795:查看“15秒钟”这个由三部分组成的系列文章:http://www.15seconds.com/issue/050803.htm –