Ahmad Yaseen

Qué elegir al asignar valores a las variables de SQL Server: sentencias SET vs SELECT T-SQL

November 4, 2019 by

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:

Los datos que fueron insertados se pueden verificar utilizando la siguiente instrucción SELECT:

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”:

De la misma forma, la siguiente instrucción SELECT se puede usar para asignar la variable @ EmpName2 con el valor escalar “Ali”:

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:

Select data using sql variable

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:

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:

Los resultados de las dos consultas anteriores se van a mostrar en la pestaña de Mensajes como se muestra a continuación:

the result of SQL variable query

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:

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:

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:

output of select statement

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:

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:

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:

Printed message of executed uery

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:

Select statement output

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:

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:

Subquery error message with variable

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:

Output of select statement

El script que se usa para poder asignar el valor a la variable @EmpName de la tabla SetVsSelectDemo será como el siguiente:

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:

NULL values in a variable

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:

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:

Subquery and NULL statement values

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

Ahmad Yaseen
T-SQL

Acerca de Ahmad Yaseen

Ahmad Yaseen is a Microsoft Big Data engineer with deep knowledge and experience in SQL BI, SQL Server Database Administration and Development fields. He is a Microsoft Certified Solution Expert in Data Management and Analytics, Microsoft Certified Solution Associate in SQL Database Administration and Development, Azure Developer Associate and Microsoft Certified Trainer. Also, he is contributing with his SQL tips in many blogs. View all posts by Ahmad Yaseen

21,089 Views