2011-04-22 20 views
7

Estoy analizando algún código SQL anterior en un procedimiento almacenado.¿Cómo funciona el encadenamiento de asignaciones variables en SQL?

Declare @Var1 money, 
    @Var2 money, 
    @Var3 money, 

etc ...

Select @Var1 = OldValue, 
     @Var2 = @Var1, 

etc ...

Así que me pregunto cómo funcionan estas tareas cuando ambos están en la misma instrucción de selección. Asumo Var2 = OldValue después de que se llama a la selección, pero quiero estar seguro.

¿Cuáles son las reglas que rodean esta situación? ¿Las asignaciones se ejecutan en el orden en que se declaran? Si es así, ¿qué valor se le asignaría a var2 en el siguiente caso:

Select @Var2 = @Var1, 
     @Var1 = OldValue, 

Gracias!

+1

Actualmente está siendo utilizado en un procedimiento almacenado algo simple y parece estar funcionando. Así que supongo que estoy bastante seguro de que está funcionando como estaba previsto. De cualquier manera, es un mal estilo en mi opinión. – Brett

Respuesta

9
DECLARE @Var1 MONEY = 100, @Var2 MONEY = 50 

SELECT @Var1 = @Var2, 
     @Var2 = @Var1 

SELECT @Var1, @Var2 

devoluciones

--------------------- --------------------- 
50.00     50.00 

Así que en ese caso en que fueron ejecutados en orden de izquierda a derecha pero esto no se puede confiar!

Si hay una asignación múltiple cláusulas en una sola instrucción SELECT, SQL Server no garantiza el orden de evaluación de las expresiones . Tenga en cuenta que los efectos son solo visibles si hay referencias entre las asignaciones.

Fuente http://msdn.microsoft.com/en-us/library/ms187953.aspx

+1

Gracias por la buena respuesta, y el enlace a la documentación realmente lo hace increíble. – Brett

1

En el caso de @ var2 = @ var1 primero, creo que var2 es NULL.- serán tipos de valor, por lo que no hay ninguna referencia en segundo plano como lo haría en un idioma como .Net

siempre puede probar extrayendo el código sql, putt los resultados en una variable de tabla y luego seleccione de eso para ver lo que tiene.

1

Por qué no le acaba de hacer esto si quieres @ val2 tener el mismo valor que @ val1

Select @Var2 = OldValue, 
     @Var1 = OldValue, 
+0

Lo harías. Es un código incorrecto, y estoy en el proceso de reemplazarlo por completo. – Brett

+0

A partir del pseudocódigo especificado en la pregunta, no está claro qué significa "OldValue". Si "OldValue" es una expresión no determinista, la sugerencia de HLGEM puede no asignar el mismo valor a ambas variables. – sqlvogel

Cuestiones relacionadas