2009-10-14 7 views
2

J'essaie de reconstituer tous les exemples que j'ai vus pour trouver des éléments et les modifier, mais je n'ai pas encore trouvé quelque chose qui fonctionne. 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. Je suis en train de changer le ItemID 4-999:Comment modifier le texte d'un élément correspondant avec XQuery?

DECLARE @x XML 
SELECT @x = ' 
<ValueCollection> 
    <ItemGroup Name="Group A"> 
    <ItemID>1</ItemID> 
    <ItemID>2</ItemID> 
    </ItemGroup> 
    <ItemGroup Name="Group B"> 
    <ItemID>3</ItemID> 
    <ItemID>4</ItemID> 
    </ItemGroup> 
</ValueCollection> 
'; 

SET @x.modify (' 
replace value of 
    (/ValueCollection/ItemGroup[ItemID="4"]/ItemID/text())[1] 
with "999" 
') 

SELECT @x; 

Mais ce qui se passe est ItemID 3 devient changé à 999 au lieu de 4, comme indiqué dans les résultats ci-dessous. Je pense que ce qui se passe est le "/ ItemGroup [ItemID =" 4 "] est la localisation correcte <ItemGroup>, puis le filtre de position [1] donne le premier <ItemID> dans ce <ItemGroup> (qui est ID 3) -.. Je viens ai pas trouvé comment changer le filtre de position à une variable

<ValueCollection> 
    <ItemGroup Name="Group A"> 
    <ItemID>1</ItemID> 
    <ItemID>2</ItemID> 
    </ItemGroup> 
    <ItemGroup Name="Group B"> 
    <ItemID>999</ItemID> 
    <ItemID>4</ItemID> 
    </ItemGroup> 
</ValueCollection> 

Je sens qu'il est quelque chose de simple que mon googling et stackoverflowing n'a pas encore tourné Ï apprécie votre aide
Kevin

Répondre

2
SET @x.modify ('replace value of 
    (/ValueCollection/ItemGroup/ItemID[text()=4]/text())[1] 
    with "999" 
    ') 

ou si vous voulez être plus précis:

SET @x.modify ('replace value of 
    (/ValueCollection/ItemGroup[@Name="Group B"]/ItemID[text()=4]/text())[1] 
    with "999" 
    ') 
Questions connexes