2009-09-17 9 views
21

Je dois mettre à jour le champ GroupID à 0. J'ai trouvé comment récupérer la valeur, je rencontre actuellement des problèmes de mise à jour.Valeur de nœud XML de mise à jour dans SQL Server

Toute aide serait géniale!

<ProblemProfile> 
    <GroupID>-1</GroupID> 
    <LayoutID>1</LayoutID> 
    <MyQueries>false</MyQueries> 
</ProblemProfile> 

Declare @Result xml 
set @Result = convert(xml,(select ProfileXML from profiles where id = 23)) 

SELECT x.value('.', 'int') ID 
FROM @Result.nodes('/ProblemProfile/GroupID') as R(x) 

Mise à jour

Ce que je dois faire maintenant est mise à jour GroupID de chaque ligne unique qui a la valeur de « foo »

declare @foo int 
set @foo = -1 

UPDATE profiles 
SET ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') = @foo 

Ceci est mise à jour seule la première ligne qui répond ce critère. Comment est-ce que je mettrais à jour chaque rangée?

Update 2 Cette déclaration fonctionne. Il s'avère que la structure de la base de données pour le premier noeud peut être différente. Un simple //GroupID...etc mis à jour chaque ligne. Ce sont toujours les petites choses stupides qui nous trébuchent haha.

Répondre

32

Vous pouvez faire quelque chose comme ceci:

UPDATE 
    dbo.profiles 
SET 
    ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE 
    id = 23 

Vérifiez cet article sur SQL Server 2005 XQuery and XML-DML pour plus de détails sur ce que vous pouvez faire avec le mot-clé .modify (insérer, supprimer, remplacer, etc.).

Marc

PS: Pour obtenir la valeur, il serait beaucoup plus facile de faire ceci:

SELECT ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') as ID 
FROM dbo.profiles 
WHERE id = 23 

(à moins bien sûr vous avez besoin du XML comme une variable SQL pour quelque chose sinon plus tard)

+0

En fait, l'utilisation de nodes() et values ​​() est une bonne pratique. Dans ce cas, cela ne fait aucune différence, mais si plusieurs colonnes sont demandées, mieux vaut utiliser nodes(): "La combinaison des méthodes nodes() et value() peut être plus efficace pour générer l'ensemble de lignes quand il a plusieurs colonnes "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@Remus: oui, bon point - si vous avez besoin de plusieurs valeurs, l'utilisation de nodes() est tout à fait logique, je suis d'accord . –

+1

Excellent. juste ce que j'ai besoin. –

Questions connexes