2010-07-06 4 views
1

Si vous avez ce xmlplusieurs attributs avec Transact-SQL remplacer - XML ​​

<AssetComponent name="AssetComponent4881" width="300"> 
    <Asset id="5" type="1" /> 
</AssetComponent> 
<AssetComponent name="AssetComponent4882" width="300"> 
    <Asset id="5" type="1" /> 
</AssetComponent> 

Est-il possible de remplacer tous les ids de 5 à 6 dans une requête?

Avec cette sql un seul attribut au moment peut être remplacé:

SET @myDoc.modify(' 
    replace value of (//Asset/@id)[1] 
    with  sql:variable("@BinaryAssetId") 
') 

De la documentation sql je peux voir que le remplacement doit retourner un nœud atomique, un seul, donc est-il une autre façon de faire ce?

Répondre

1

La dernière fois que j'ai regardé cela, il n'y avait pas de telle manière - replace ne fonctionne que sur un seul élément à la fois. La solution (désagréable) que j'ai trouvée à l'époque était (pseudo-code):

Supposons que nous voulions changer les enregistrements d'un état à un autre; appelons ces états l'état 'de' (par exemple Asset/@id = '5') et l'état 'à' (par exemple Asset/@id = '6'). Ensuite, exécutez cette boucle:

WHILE there exists a record that is in the 'from' state 
    BEGIN 
    Execute a .modify that changes the first record in the 'from' state 
     to being in the 'to' state 
    END 

Ce n'est pas joli, mais cela fonctionne.

+0

Thx, a travaillé comme un charme. –

1
While(@Maxcount <> 0) 
BEGIN 
     SET @myDoc.modify(' 
      replace value of (//Asset/@id)[sql:variable("@Maxcount")] 
      with  sql:variable("@BinaryAssetId") 
     ') 
     SET @MaxCount = @MaxCount - 1 
END