SET vs SELECT

Este es un tema algo trivial, pero igual me parecio importante compartir con todos las diferencias que existen entre las instrucciones SET y SELECT cuando se utilizan para asignar valores a una variable en Transac-SQL.

La instrucción SET es ANSI, es decir que es estandard y su uso no esta limitado a SQL Server, sino que también puede ser utilizada en Oracle, MySQL o algun otro motor de base de datos relacional que implemente el estandard ANSI. Por otro lado, la instrucción SELECT también puede ser utilizada para asignar valores a variables, pero no es una instrucción ANSI, sino que es parte de Transac-SQL

Si se desea asignar un valor a una variable en base a una consulta, la instrucción SET puede asignar solo un valor a la vez, es decir que si la consulta retorna más de una fila, nos saldrá un error como el siguiente:

Msg 512, Level 16, State 1, Line 210
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Mientras que, si se utiliza la instrucción SELECT para asignar un valor en base a una consulta que retorna más de un registro, no se generará ningún error y el valor que se asignará a la variable sera el último que retorne la consulta

Caso contrario, si la consulta utilizada para asignar un valor a una variable no retorna ningún registro, entonces los comandos SET y SELECT también tendrán comportamientos distintos. Por ejemplo, en el caso de la instrucción SET, se asignará un valor NULL, mientras que la instrucción SELECT simplemente no modificará el valor anterior que haya tenido la variable:

Otra diferencia muy importante entre ambas instrucciones es la cantidad de variables a las que se les puede asignar valores en una sola instrucción, y es que la sentencia SET solo permite asignar el valor a 1 variable, mientras que la sentencia SELECT si permite asignar el valor a multiples variables dentro de la misma sentencia, y esta es la razón por la cuál tiene una ligera ventaja en la performance sobre la sentecia SET.

Resultados de tiempo de CPU de la instrucción SET:

opera_2018-08-07_14-48-06

Resultados de tiempo de CPU de la instrucción SELECT:

opera_2018-08-07_14-48-40

2 comentarios sobre “SET vs SELECT

  1. Pues a mi no me parecio trivial, sobre todo el hecho de ver que SET consume mas tiempo de CPU que el SELECT
    Eso me parecio MUY INTERESANTE.
    Una vez mas… gracias por tus articulos.
    Andres

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s