Actualizar el valor del nodo XML en SQL Server


Necesito actualizar el campo groupId a 0. He descubierto cómo recuperar el valor, ahora me estoy topando con problemas para actualizarlo.

Cualquier ayuda sería genial!

<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)

Actualización

Lo que necesito hacer ahora es actualizar el groupId de cada fila que tenga el valor 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

Esto es solo actualizar la primera fila que cumple con este criterio. ¿Cómo actualizaría cada fila?

Actualización 2 Esa declaración funciona. Convertir la estructura de la base de datos para el primer nodo puede ser diferente. Un simple / / groupId...etc actualizado cada fila. Siempre son las pequeñas cosas estúpidas las que nos hacen tropezar jaja.

Author: marc_s, 2009-09-17

2 answers

, puedes hacer algo como esto:

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

Consulte este artículo sobre SQL Server 2005 XQuery y XML-DML para obtener más detalles sobre lo que puede hacer con la palabra clave .modify (insertar, eliminar, reemplazar, etc.).

Marc

PD: Para obtener el valor, sería mucho más fácil hacer esto:

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

(a menos que, por supuesto, necesite el XML como una variable SQL para otra cosa más adelante)

 33
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-22 20:12:32

La forma más sencilla de cambiar el texto dentro del elemento

UPDATE [TableName]
   SET  
      [fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
 0
Author: Tarek El-Mallah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 18:37:05