2009-09-17 28 views
21

Necesito actualizar el campo ID de grupo a un 0. He descubierto cómo recuperar el valor, ahora estoy teniendo problemas para actualizarlo.Actualizar el valor del nodo XML en SQL Server

¡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 hay que hacer ahora es actualizar GroupID de cada fila que tiene 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 sólo es la actualización de la primera fila que cumpla este criterio ¿Cómo actualizaría cada fila?

Actualización 2 Esa declaración funciona. Resulta que 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.

Respuesta

32

se puede hacer algo como esto:

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

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

Marc

PS: Con el fin de obtener el valor, sería mucho más fácil de hacer precisamente esto:

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

(a menos, por supuesto, se necesita el XML como una variable de SQL para algo más adelante)

+0

En realidad, el uso de nodos() y valores() es una buena práctica. En este caso no hace ninguna diferencia, pero si se solicitan varias columnas es mejor usar nodes(): "La combinación de los métodos nodes() y value() puede ser más eficiente al generar el conjunto de filas cuando tiene varias columnas "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@Remus: sí, buen punto - si necesita varios valores, el uso de nodos() tiene mucho sentido, estoy de acuerdo . –

+1

Excelente. justo lo que necesito. –

Cuestiones relacionadas