SQL Server nos va a proporcionar dos métodos en T-SQL para poder asignar un valor a una variable SQL local previamente creada. El primer método es la instrucción SET, la instrucción estándar ANSI que se utiliza comúnmente para la asignación de los valores variables. El segundo método es la instrucción es la declaración SELECT. Además de su uso principal para poder formar la lógica que se usa para recuperar datos de una tabla de base de datos o varias tablas en SQL Server, la instrucción SELECT se puede utilizar igualmente para asignar un valor a una variable local previamente creada directamente o desde una variable, Vista o tabla.
Pese a que ambas sentencias T-SQL cumplen la tarea de asignación de valor de variable SQL, hay una serie de diferencias entre las sentencias SET y SELECT que pueden guiarlo a poder elegir una de ellas en circunstancias específicas, sobre la otra. En este artículo, vamos a describir en detalle cuándo y por qué elegir entre los dos métodos: instrucciones SET y SELECT T-SQL al asignar un valor a una variable.
Empecemos con la creación de una nueva tabla y la vamos a llenar con algunos registros para nuestra demostración. Esto se puede lograr utilizando el siguiente script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
USE SQLShackDemo GO CREATE TABLE SetVsSelectDemo ( ID INT IDENTITY (1,1) PRIMARY KEY, Name NVARCHAR (50), GroupNumber INT, Grade INT ) GO INSERT INTO SetVsSelectDemo VALUES ('Adel',1,350) INSERT INTO SetVsSelectDemo VALUES ('Faisal',1,240) INSERT INTO SetVsSelectDemo VALUES ('Huda',2,180) INSERT INTO SetVsSelectDemo VALUES ('Zaid',2,170) INSERT INTO SetVsSelectDemo VALUES ('Zaina',3,290) INSERT INTO SetVsSelectDemo VALUES ('John',4,400) INSERT INTO SetVsSelectDemo VALUES ('Igor',4,375) |
Los datos que fueron insertados se pueden verificar utilizando la siguiente instrucción SELECT:
1 |
SELECT * FROM SetVsSelectDemo |
Y los datos se van a mostrar a continuación:
Si logramos poder asignar un valor escalar para la variable SQL que se definió previamente, usando la instrucción DECLARE, las instrucciones SET y SELECT lograrán el objetivo de la misma manera. La siguiente instrucción SET se va a utilizar para asignar la variable @ EmpName1 con el valor escalar “Ali”:
1 2 3 4 |
DECLARE @EmpName1 NVARCHAR(50) SET @EmpName1 = 'Ali' PRINT @EmpName1 GO |
De la misma forma, la siguiente instrucción SELECT se puede usar para asignar la variable @ EmpName2 con el valor escalar “Ali”:
1 2 3 4 |
DECLARE @EmpName2 NVARCHAR(50) SELECT @EmpName2 = 'Ali' PRINT @EmpName2 GO |
Los valores asignados para las variables en las consultas anteriores se mostrarán en la pestaña de Mensajes como se muestra a continuación:
SQL Server nos permitirá asignar los valores para una variable SQL desde una tabla o vista de base de datos. La consulta a que viene a continuación se utiliza para poder asignar a la variable @ EmpName el valor de la columna Nombre de los miembros del tercer grupo de la tabla SetVsSelectDemo usar la instrucción SET:
1 2 3 4 |
DECLARE @EmpName NVARCHAR(50) SET @EmpName = (SELECT [Name] FROM SetVsSelectDemo WHERE GroupNumber = 3) PRINT @EmpName GO |
La instrucción SELECT también se puede emplear para realizar la misma tarea de asignación de una manera distinta como se muestra a continuación:
1 2 3 4 |
DECLARE @EmpName NVARCHAR(50) SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 3 PRINT @EmpName GO |
Los resultados de las dos consultas anteriores se van a mostrar en la pestaña de Mensajes como se muestra a continuación:
Hasta este punto, se puede ver que tanto las instrucciones SET como SELECT se pueden realizar la tarea de asignación de valor variable de la misma manera y difieren solo del lado del código.
Múltiples Variables SQL
Supongamos que necesitamos asignar valores a múltiples variables de una sola vez. La instrucción SET puede asignar un valor a una variable a la vez; Esto quiere decir que, si necesitamos asignar valores para dos variables, requerimos escribir dos declaraciones SET. En el siguiente ejemplo, cada variable va a requerir una instrucción SET separada para asignarle un valor escalar, antes de imprimirla:
1 2 3 4 5 6 |
DECLARE @EmpName1 NVARCHAR(50) , @EmpName2 NVARCHAR(50) SET @EmpName1 = 'Ali' SET @EmpName2 = 'Fadi' PRINT @EmpName1 PRINT @EmpName2 GO |
Además, la instrucción SELECT se puede utilizar para poder asignar valores a las variables SQL múltiples previamente definidas utilizando una instrucción SELECT. La siguiente instrucción SELECT se puede utilizar fácilmente para asignar valores escalares a las dos variables utilizando una declaración SELECT previamente a imprimirla:
1 2 3 4 5 |
DECLARE @EmpName1 NVARCHAR(50) , @EmpName2 NVARCHAR(50) SELECT @EmpName1 = 'Ali', @EmpName2 = 'Fadi' PRINT @EmpName1 PRINT @EmpName2 GO |
A continuación, puede apreciar el resultado impreso, que ambas declaraciones consiguen realizar la misma tarea, con la instrucción SELECT llega a ser mejor que la instrucción SET al momento de intentar asignar valores a múltiples variables debido a la simplicidad del código:
Nuevamente, si vamos a tratar de asignar valores de la tabla de la base de datos a múltiples variables, se va a requerir declaraciones SET iguales al número de las variables. En nuestro ejemplo, vamos a necesitar dos instrucciones SET para poder asignar valores de la tabla SetVsSelectDemo a las variables @EmpName y @EmpGrade como se muestra a continuación en el script:
1 2 3 4 5 6 |
DECLARE @EmpName NVARCHAR(50), @EmpGrade INT SET @EmpName = (SELECT [Name] FROM SetVsSelectDemo WHERE GroupNumber = 3) SET @EmpGrade = (SELECT [Grade] FROM SetVsSelectDemo WHERE GroupNumber = 3) PRINT @EmpName PRINT @EmpGrade GO |
Por otro lado, solo se puede utilizar una instrucción SELECT para poder asignar valores de la tabla SetVsSelectDemo a las variables SQL @EmpName y @EmpGrade, empleando una consulta más simple como se muestra claramente a continuación:
1 2 3 4 5 |
DECLARE @EmpName NVARCHAR(50), @EmpGrade INT SELECT @EmpName=[Name] , @EmpGrade =[Grade] FROM SetVsSelectDemo WHERE GroupNumber = 3 PRINT @EmpName PRINT @EmpGrade GO |
Es obvio que, de las dos consultas anteriores, la consulta que usa es la instrucción SELECT ya que es más eficiente que la que usa la instrucción SET cuando se asignan valores a múltiples variables al mismo tiempo, debido a que la instrucción SET solo puede asignar una variable a la vez. Los resultados llegan a ser similares en las dos consultas anteriores que se imprimen en la pestaña Mensajes, los cuales serán los siguientes en nuestro caso:
Valores Múltiples
El segundo punto, en el que se muestra la diferencia entre asignar valores a las variables SQL usando las instrucciones SELECT o SET, es cuando el conjunto de resultados de la consulta de subconsulta que se utiliza para poder asignar un valor a la variable nos devuelve más de un valor. En ese caso, la instrucción SET va a devolver un error, ya que solo acepta un valor escalar de la subconsulta para así poder asignarlo a la variable, mientras que la instrucción SELECT acepta esa situación, en la que la subconsulta devolverá múltiples valores, sin generar ningún error. Por otro lado, no llegará a tener ningún control sobre qué valor se asignará a la variable, donde el último valor devuelto por la subconsulta se asignará a la variable.
Suponga que necesitamos asignar el valor de Nombre del segundo grupo de la tabla SetVsSelectDemo creada previamente a la variable SQL @EmpName. Recuerde que el segundo grupo en esa tabla contiene dos registros en el conjunto de resultados como se muestra a continuación:
El script que se utiliza para asignar el valor de la variable @ EmpName de la tabla SetVsSelectDemo empleando las instrucciones SET y SELECT será como sigue:
1 2 3 4 5 6 7 8 9 |
DECLARE @EmpName NVARCHAR(50) SET @EmpName = (SELECT [Name] FROM SetVsSelectDemo WHERE GroupNumber = 2) PRINT @EmpName GO DECLARE @EmpName NVARCHAR(50) SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 2 PRINT @EmpName GO |
Debido al hecho de que, la instrucción de subconsulta devolvió dos registros, la asignación de valor a la variable SQL @ EmpName utilizando la instrucción SET va a fallar, ya que la instrucción SET puede asignar solo un valor único a las variables. Este no es el caso cuando se asigna valor a la variable @EmpName utilizando la instrucción SELECT que tendrá éxito sin error, asignando el nombre del segundo registro devuelto, que es “Zaid”, a la variable como se muestra a continuación en los mensajes de resultado:
Podemos aprender del resultado anterior, que cuando este espera que la subconsulta devuelva más de un valor, es aconsejable usar la instrucción SET para poder asignar valor a la variable mediante la implementación de un mecanismo de manejo de errores más adecuado, en lugar de utilizar la instrucción SELECT, eso hará que se asigne el último valor devuelto a la variable SQL, sin error devuelto para advertirnos que la subconsulta devolvió múltiples valores.
No asignar ningún valor
Otra diferencia entre tratar de asignar valores a las variables SQL utilizando las instrucciones SET y SELECT, es cuando la subconsulta que se utiliza para poder asignar un valor a la variable que no devuelve ningún valor. Si la variable previamente declarada no tiene un valor inicial, tanto la instrucción SET como la SELECT actuarán de la misma forma, asignando un valor NULL a esa variable.
Supongamos que necesitamos asignar la variable @EmpName, sin valor inicial, el Nombre del quinto grupo de la tabla SetVsSelectDemo. tome en cuenta que esta tabla no tiene registros que pertenezcan al quinto grupo como se muestra a continuación:
El script que se usa para poder asignar el valor a la variable @EmpName de la tabla SetVsSelectDemo será como el siguiente:
1 2 3 4 5 6 7 8 9 |
DECLARE @EmpName NVARCHAR(50) SET @EmpName = (SELECT [Name] FROM SetVsSelectDemo WHERE GroupNumber = 5) SELECT @EmpName AS SET_Name GO DECLARE @EmpName NVARCHAR(50) SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 5 SELECT @EmpName AS SELECT_Name GO |
Al no tener un valor inicial para la variable @EmpName, y ningún valor devuelto por la subconsulta, se va asignar un valor NULL a esa variable en ambos casos, como se muestra claramente a continuación en el mensaje de resultado:
Si la variable SQL previamente declarada tiene un valor inicial, y la subconsulta que se utiliza para asignar un valor a la variable no devuelve ningún valor, las instrucciones SET y SELECT se comportarán de distintas maneras. En este caso, la instrucción SET anulará el valor inicial de la variable y nos devolverá el valor NULL. Por el contrario, la instrucción SELECT no anulará el valor inicial de la variable y lo devolverá, si no se devuelve ningún valor de la subconsulta de asignación.
Si acordamos nuevamente asignar la variable @EmpName, el Nombre del quinto grupo de la tabla SetVsSelectDemo, recordando que esta tabla no tiene registros que pertenezcan al quinto grupo, pero esta vez, después de establecer un valor inicial para el SQL @EmpName variable durante la declaración de variable, usando las instrucciones SET y SELECT, como se muestra a continuación en el script:
1 2 3 4 5 6 7 8 9 |
DECLARE @EmpName NVARCHAR(50)='Sanya' SET @EmpName = (SELECT [Name] FROM SetVsSelectDemo WHERE GroupNumber = 5) SELECT @EmpName AS SET_Name GO DECLARE @EmpName NVARCHAR(50)='Sanya' SELECT @EmpName = [Name] FROM SetVsSelectDemo WHERE GroupNumber = 5 SELECT @EmpName AS SELECT_Name GO |
Tomando en cuenta que la subconsulta de asignación no devolvió ningún valor, la consulta que uso la instrucción SET para poder asignar valor a la variable SQL anulará el valor inicial de la variable, devolviendo el valor NULL. En el tiempo que la consulta que utilizó la instrucción SELECT para asignar valor a la variable mantendrá el valor inicial sin cambios ya que la subconsulta no devuelve ningún valor, como se muestra claramente a continuación en los resultados:
Conclusión
SQL Server nos proporciona los dos principales métodos que se usan para poder asignar valores a las variables SQL. En la mayoría de los casos, las instrucciones SET y SELECT cumplen con la tarea de asignación de valor variable sin problemas. En algunas situaciones, puede preferir usar uno sobre el otro, como:
- Si logra poder asignar valores a múltiples variables directamente o desde una tabla de base de datos, es mejor usar la instrucción SELECT, que requiere solo una instrucción, sobre la instrucción SET debido a la simplicidad de codificación
- Si sigue el estándar ANSI para propósitos de migración de código, utilice la instrucción SET para la asignación de valores de variables SQL, ya que la instrucción SELECT no sigue el estándar ANSI
- Si la subconsulta de asignación devuelve varios valores, el uso de la instrucción SET para asignar valor a una variable va a generar un error, ya que este solo acepta un valor único, donde la instrucción SELECT asignará el último valor devuelto de la subconsulta a la variable, sin control de su parte
- Si la subconsulta de asignación no devuelve ningún valor, la instrucción SET anulará el valor inicial de la variable a NULL, mientras que la instrucción SELECT no anulará su valor inicial
- Restricciones en SQL Server: SQL NOT NULL, UNIQUE y SQL PRIMARY KEY - December 16, 2019
- Operaciones de copia de seguridad, truncamiento y reducción de registros de transacciones de SQL Server - November 4, 2019
- Qué elegir al asignar valores a las variables de SQL Server: sentencias SET vs SELECT T-SQL - November 4, 2019