Buscar contenidos

lunes, 13 de abril de 2020

Cuándo utilizar SET vs SELECT al asignar valores a las variables en SQL Server

http://blog.jmacoe.com/gestion_ti/base_de_datos/cuando-utilizar-set-vs-select-al-asignar-valores-a-las-variables-en-sql-server/


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