Asignar múltiples valores a múltiples variables
Si tienes que poblar múltiples variables, en lugar de utilizar instrucciones SET por separado cada vez, considera el uso de SELECT para poblar todas las variables en una sola instrucción. Esto puede ser usado para poblar las variables en forma directa o mediante la selección de valores desde la base de datos.
Considera el siguiente script que compara el uso de SELECT y SET:
Script #3. Poblar múltiples variables a través de SELECT
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| USE AdventureWorks GO -- <span id="IL_AD2" class="IL_AD">Part 1</span>. Assign direct values to multiple variables DECLARE @var1 VARCHAR (50) DECLARE @var2 VARCHAR (50) DECLARE @var3 VARCHAR (50) SELECT @var1 = 'Value1' , @var2 = 'Value2' , @var3 = 'Value3' PRINT @var1 PRINT @var2 PRINT @var3 GO -- Part 2. Assign retrieved values to multiple variables DECLARE @ name VARCHAR (50) DECLARE @productNo VARCHAR (25) DECLARE @color VARCHAR (15) SELECT @ name = [ Name ], @productNo = ProductNumber, @color = Color FROM Production.Product WHERE ProductID = 320 PRINT @ name PRINT @productNo PRINT @color GO |
Si estás usando SET, entonces cada varible debe tener asignado valores individualmente a través de múltiples instrucciones como se muestra a continuación:
Script #4. Poblar múltiples variables a través de SET
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| USE AdventureWorks GO -- Part 1. Assign direct values to multiple variables DECLARE @var1 VARCHAR (50) DECLARE @var2 VARCHAR (50) DECLARE @var3 VARCHAR (50) SET @var1 = 'Value1' SET @var2 = 'Value2' SET @var3 = 'Value3' PRINT @var1 PRINT @var2 PRINT @var3 GO -- Part 2. Assign retrieved values to multiple variables DECLARE @ name VARCHAR (50) DECLARE @productNo VARCHAR (25) DECLARE @color VARCHAR (15) SET @ name =( SELECT [ Name ] FROM Production.Product WHERE ProductID = 320) SET @productNo = ( SELECT ProductNumber FROM Production.Product WHERE ProductID = 320) SET @color = ( SELECT Color FROM Production.Product WHERE ProductID = 320) PRINT @ name PRINT @productNo PRINT @color GO |
Obviamente SELECT es mas eficiente que SET mientras asigna valores a múltiples variables en términos de instrucciones ejecutadas, código y bytes de red.
¿Qué si la variable no se pobla con éxito?
Si una variable no es poblada con éxito entonces el comportamiento de SET y SELECT sería diferente. Fallas en la asignación puede ser debido a que ningún resultado es devuelto o cualquier otro valor no compatible con la variable. En este caso, SELECT preservará el valor anterior, si lo hubiere, donde SET retornará NULL. Debido a la diferente funcionalidad, ambos pueden conducir a resultados inesperados y se deben considerar con cuidado.
Esto se demuestra en el siguiente script:
Script# 5. Comportamiento de SET y SELECT para valor faltante
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
| USE AdventureWorks GO -- Part 1. Observe behavior of missing result with SET DECLARE @var1 VARCHAR (20) SET @var1 = 'Value 1 Assigned' PRINT @var1 SET @var1 = ( SELECT Color FROM Production.Product WHERE ProductID = 32022) PRINT @var1 GO -- Part 1. Observe behavior of missing result with SELECT DECLARE @var1 VARCHAR (20) SELECT @var1 = 'Value 1 Assigned' PRINT @var1 SELECT @var1 = Color FROM Production.Product WHERE ProductID = 32023 PRINT @var1 GO |
Podemos observar que la parte 1 genera NULL cuando no devuelve ningun valor para poblar la variable. en cambio la parte 2 produce el valor previo que se conserva despues de la asignacion fallida de la variable. Esta situación puede conducir a resultados inesperados y requiere consideración.
Siguiendo los estandares
Usar SELECT puede parecer la mejor opción para escenarios especificos, pero ten en cuenta que SELECT se usa para asignar valores a las variables no esta incluido en los estandares ANSI. Si sigues los estandares para fines de migracion de código, entonces evita el uso de SELECT y usa SET en su lugar.
Conclusión
Las mejores prácticas no apegarse a un método. Según los escenarios es posible que desee utilizar tanto SET como SELECT.
A continuación se presentan algunos escenarios para usar SET:
- Si estás obligado a asignar un solo valor directamente a la variable y no hay consulta para buscar el valor.
- Se esperan asignaciones NULL (retorna NULL en un conjunto de resultados).
- Los estandares están destinados a pasar cualquier plan de migración.
- Se esperan resultados no escalares y deben ser manipulados.
Usando SELECT es eficiente y flexible en los siguientes casos:
- Múltiples variables están siendo pobladas por asignación directa de valores.
- Múltiples variables están siendo pobladas por una unica fuente (tabla, vista).
- Menos codigo para asignar multiples variables.
- Usa esta opción si necesitas @ROWCOUNT y @ERROR de la última sentencia ejecutada.
No hay comentarios:
Publicar un comentario