web-dev-qa-db-fra.com

Mettre à jour la valeur du noeud XML dans SQL Server

Je dois mettre à jour le champ GroupID sur 0. J'ai découvert comment récupérer la valeur, je rencontre maintenant des problèmes pour la mettre à jour. 

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)

Mettre à jour

Ce que je dois faire maintenant, c'est mettre à jour le GroupID de chaque ligne ayant la valeur '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 ne fait que mettre à jour la première ligne qui répond à ce critère. Comment pourrais-je mettre à jour chaque ligne?

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

23
Ryan

Vous pouvez faire quelque chose comme ça:

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

Consultez cet article sur SQL Server 2005 XQuery et 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

(sauf si vous avez besoin du XML en tant que variable SQL pour autre chose ultérieurement)

34
marc_s

Le moyen le plus simple de changer l'élément text inside

UPDATE [TableName]
   SET  
      [fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
0
Tarek El-Mallah