¿Cuáles son las diferencias entre las declaraciones SET
y SELECT
al asignar variables en T-SQL?
290
¿Cuáles son las diferencias entre las declaraciones SET
y SELECT
al asignar variables en T-SQL?
Cita , que resume de este artículo :
- SET es el estándar ANSI para la asignación de variables, SELECT no lo es.
- SET solo puede asignar una variable a la vez, SELECT puede realizar múltiples asignaciones a la vez.
- Si asigna desde una consulta, SET solo puede asignar un valor escalar. Si la consulta devuelve múltiples valores / filas, SET generará un error. SELECT asignará uno de los valores a la variable y ocultará el hecho de que se devolvieron múltiples valores (por lo que es probable que nunca sepas por qué algo iba mal en otro lugar; diviértete resolviendo ese problema)
- Al asignar desde una consulta si no se devuelve ningún valor, SET asignará NULL, donde SELECT no realizará la asignación (por lo que la variable no cambiará de su valor anterior)
- En cuanto a las diferencias de velocidad, no hay diferencias directas entre SET y SELECT. Sin embargo, la capacidad de SELECT para realizar múltiples tareas en un solo disparo le da una ligera ventaja de velocidad sobre SET.
SELECT @Int = @Int + 1, @Int = @Int + 1
si se@Int
inicia como 0, termina como 2. Esto puede ser muy útil cuando se realizan sucesivas manipulaciones de cadenas.Creo que
SET
es el estándar ANSI, mientras que elSELECT
no lo es. Observe también el comportamiento diferente deSET
vs.SELECT
en el siguiente ejemplo cuando no se encuentra un valor.fuente
select @var = (select name from master.sys.tables where name = 'qwerty')
lo usaras, obtendrías @var como nulo. El ejemplo que está dando no es la misma consulta.(select name from master.sys.tables where name = 'qwerty')
para uno, yname from master.sys.tables where name = 'qwerty'
para el otro ... ¿no lo ves?(select name from master.sys.tables where name = 'qwerty')
es una subconsulta escalar yname from master.sys.tables where name = 'qwerty'
es una consulta simple. No se supone que las dos expresiones diferentes produzcan los mismos resultados, aunque parece que estás insinuando que deberían hacerlo. Si está tratando de decir que las palabras claveSET
ySELECT
tienen implementaciones diferentes, no debe usar dos expresiones diferentes en sus ejemplos. msdn.microsoft.com/en-us/library/ms187330.aspxAl escribir consultas, esta diferencia debe tenerse en cuenta:
fuente
Además de ser ANSI y velocidad, etc., hay una diferencia muy importante que siempre me importa; más que ANSI y velocidad. El número de errores que he solucionado debido a este importante pasar por alto es grande. Busco esto durante las revisiones de código todo el tiempo.
Casi siempre, eso no es lo que el desarrollador pretende. En lo anterior, la consulta es sencilla, pero he visto consultas que son bastante complejas y averiguar si devolverá un solo valor o no, no es trivial. La consulta suele ser más compleja que esta y, por casualidad, ha devuelto un valor único. Durante las pruebas de desarrollador, todo está bien. Pero esto es como una bomba de relojería y causará problemas cuando la consulta devuelva múltiples resultados. ¿Por qué? Porque simplemente asignará el último valor a la variable.
Ahora intentemos lo mismo con
SET
:Recibirá un error:
Eso es sorprendente y muy importante porque ¿por qué querrías asignarle un "último elemento en resultado" trivial al
@employeeId
. Conselect
usted nunca obtendrá ningún error y pasará minutos, horas depurando.Tal vez, está buscando un único ID y
SET
lo obligará a corregir su consulta. Por lo tanto, puede hacer algo como:Limpiar
En conclusión, use:
SET
: Cuando desea asignar un solo valor a una variable y su variable es para un solo valor.SELECT
: Cuando desea asignar varios valores a una variable. La variable puede ser una tabla, una tabla temporal o una variable de tabla, etc.fuente