2011-10-23 2 views
2

Je tente de mettre à jour un noeud de mon XML qui est stocké dans une colonne SQL Server XML, la ligne ci-dessous fonctionne si mon XML est dans un élément XML mais maintenant je dois changer en attributs XML, apparemment la ligne devient invalide après le changement.Mise à jour de l'attribut XML dans la colonne SQL Server XML

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

J'ai essayé de changer la déclaration comme ça, mais pas de chance, pas d'erreur, mais QTY valeurs ne se change pas à la valeur de @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 

Cette est l'aspect de mon XML dans la colonne 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

enlevé les balises 'asp.net',' C# 'et' vb.net' - n'a rien à voir avec aucune de ces technologies, vraiment .. –

Répondre

7

Vous devez utiliser les fonctions XQuery - accumulez pas votre XML comme celui-ci ....

Essayez ceci:

DECLARE @newquantity INT = 55 

UPDATE dbo.Customers 
SET voucherXML.modify('replace value of (/ArrayOfCampaignVoucher/CampaignVoucher[@VouCode="Vouc002"]/@Qty)[1] with sql:variable("@NewQuantity") ') 

Cela fonctionne pour moi - l'attribut Qty du nœud avec VouCode="Vouc002" est mis à jour à la valeur I définie avant dans une variable SQL

Mise à jour: pour insérer une nouvelle entrée <CampaignVoucher>, utilisez XQuery quelque chose comme ceci:

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

Merci pour l'aide, pourriez-vous me donner un exemple sur insertion d'un nouvel attribut: ajout d'une autre ligne de VouCode et de Quantity ainsi que suppression d'un attribut basé sur VouCode. J'essaie de trouver des tutoriels sur ce sujet avec peu de chance. Merci! – k80sg

+0

@ user415795: consultez cette série en trois parties sur "15seconds": http://www.15seconds.com/issue/050803.htm –

Questions connexes