2011-09-06 12 views
7

¿Hay alguna manera de combinar estos dos valores de reemplazo con 1 declaración de actualización?TSQL 2005, XML DML - ¿Actualizar dos valores a la vez?

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"') 
WHERE id = 1 

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"') 
WHERE id = 1 

http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx

+0

Consulte la respuesta a http://stackoverflow.com/questions/7395942/updating-multiple-xml-nodes-using-t-sql. –

Respuesta

6

No creo que tengas suerte, Thx.

Probé varias variantes sintácticas sin alegría. Por ejemplo, el obvio:

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...') 

rendimientos:

El nombre de columna 'MyXmlColumn' se especifica más de una vez en la cláusula SET . A una columna no se le puede asignar más de un valor en la misma cláusula SET . Modifique la cláusula SET para asegurarse de que una columna esté actualizada solo una vez. Si la cláusula SET actualiza columnas de una vista, entonces el nombre de columna 'MyXmlColumn' puede aparecer dos veces en la definición de vista .

Pero no hay nada útil para este mensaje de error en el espacio XML DML.

La conclusión es que Expression1 & Expression2 debe ser elementos individuales.

Incluso las discusiones más exhaustivas terminan bucle a través de él ...

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

Lo sentimos. :(

PD: Si puedes soportar el hackiness, echando a VARCHAR (MAX) y luego haciendo una normal de replace() debe hacer el truco. Véase: Can I do a find/replace in t-sql?

2

No, como se indica en la documentación, replace value of sólo puede operar en un solo nodo a la vez. Hasta donde yo sé, no hay una solución para esto. Tendrá que usar 2 instrucciones de actualización.

+1

"Tenga en cuenta que el objetivo que se está actualizando debe ser, como máximo, un nodo que se especifica explícitamente en la expresión de ruta añadiendo un" [1] "al final de la expresión." Tomé esto para decir que mi xpath solo puede devolver 1 nodo, no si puedo tener dos valores de declaración de reemplazo cada nodo de 1 objetivo – TrevDev

1

Si sólo tiene un par de valores desea para cambiar podría utilizar este enfoque que encontré en sqlservercentral. Utiliza una instrucción de selección para obtener los datos lo manipula varias veces y utiliza una única declaración de actualización para cambiar los datos de la tabla

No es perfecto, pero podría ser lo suficientemente bueno en algunos casos de uso. Básicamente es una versión simplificada de la solución de bucle para que cambie un número fijo de valores.

DECLARE @temp XML 
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId) 

SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")') 

UPDATE Table_name 
SET Column_name = @temp 
WHERE AuthId = @AuthId 
Cuestiones relacionadas