2009-10-14 9 views
3

J'essaye sans succès de créer une instruction modify() pour changer la valeur d'un attribut dans tous les éléments qui ont cette valeur d'attribut - jusqu'ici je peux seulement l'obtenir pour changer la valeur dans le premier élément apparié. J'ai créé un exemple ci-dessous de ce que j'ai à ce jour, que je suis en cours d'exécution dans SQL Server 2005:Comment remplacer la valeur d'attribut de * tous * les éléments correspondants par XQuery?

DECLARE @x XML 
SELECT @x = ' 
<FootballApparel> 
    <Item Team="Phoenix Cardinals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" /> 
    <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" /> 
</FootballApparel> 
'; 

SET @x.modify(' 
    replace value of 
    (/FootballApparel/Item[@Team="Phoenix Cardinals"]/@Team)[1] 
    with "Arizona Cardinals" 
'); 

SELECT @x; 

L'exécution de cette donne les résultats ci-dessous - seule la première instance de Phoenix Cardinals a été changé. Pouvez-vous s'il vous plaît m'aider avec l'instruction modify() correcte pour remplacer toutes les instances?

<FootballApparel> 
    <Item Team="Arizona Cardinals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" /> 
    <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" /> 
</FootballApparel> 

Merci!
Kevin

Répondre

5

Vous êtes très proche - ce que vous devez faire est de boucle (et il n'y a pas d'autre moyen que je connaisse pour le faire dans ce cas) et remplacer de façon répétée les valeurs:

WHILE @x.exist('(/FootballApparel/Item[@Team=sql:variable("@oldTeamName")])[1]') = 1 
SET @x.modify(' 
    replace value of (
    /FootballApparel/Item[@Team=sql:variable("@oldTeamName")]/@Team 
)[1] 
    with sql:variable("@newTeamName") 
'); 

Ce devrait faire l'affaire.

Marc

+0

Bonjour Marc, je dois mettre à jour plusieurs nœuds dans la base de données. Est-il possible d'utiliser une instruction xml? ou j'ai besoin d'écrire une déclaration que vous avez expliquée ci-dessus pour tous les nœuds? – Radhi

+0

@Radhi: pouvez-vous sélectionner tous ces nœuds dans le XML dans une seule instruction XPath? Si oui, vous pouvez les mettre à jour en une seule opération; sinon, vous avez besoin de plusieurs opérations "modifier" –

Questions connexes