¿Cuáles son las diferencias entre las sentencias SET
y SELECT
al asignar variables en T-SQL?SET versus SELECT cuando se asignan variables?
Respuesta
Quote, que resume de this article:
- 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 varios valores/filas, SET generará un error. SELECT asignará uno de los valores a la variable y ocultará el hecho de que se devolvieron varios valores (por lo que probablemente nunca sabrá por qué algo andaba mal en otro lugar). Se divertirá con la solución de problemas uno)
- Al asignar desde una consulta si hay no se devuelve ningún valor, SET asignará NULL, donde SELECT no hará 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 asignaciones múltiples en una toma le da una ligera ventaja de velocidad sobre SET.
Creo SET
es estándar ANSI mientras que el SELECT
no lo es. También tenga en cuenta el comportamiento diferente de SET
frente a SELECT
en el ejemplo siguiente cuando no se encuentra un valor.
declare @var varchar(20)
set @var = 'Joe'
set @var = (select name from master.sys.tables where name = 'qwerty')
select @var /* @var is now NULL */
set @var = 'Joe'
select @var = name from master.sys.tables where name = 'qwerty'
select @var /* @var is still equal to 'Joe' */
1 Es mejor correr una vez con el fin de entender, cheque, juego, memorizar que acaba de leer, pero a otras respuestas son sólo texto –
Si en realidad se utilizó 'Select @ var = (seleccione el nombre desde donde nombre master.sys.tables = 'qwerty') 'obtendrías @var como nulo. El ejemplo que estás dando no es la misma consulta. – Zack
@Zack Has perdido completamente el punto del ejemplo. –
Al escribir consultas, esta diferencia se debe tener en cuenta:
DECLARE @A INT = 2
SELECT @A = TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
SELECT @A
/* @A is 2*/
---------------------------------------------------------------
DECLARE @A INT = 2
SET @A = (
SELECT TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
)
SELECT @A
/* @A is null*/
muy agradable, sucinto – SimplyInk
- 1. yield return versus return select
- 2. ¿Cómo se asignan las variables de memoria en Javascript?
- 3. SET vs. SELECT - ¿Cuál es la diferencia?
- 4. ¿Cuándo se inicializan las variables de instancia y se asignan los valores?
- 5. ¿Las estructuras siempre se asignan asignadas o, a veces, se asignan montones?
- 6. Declaración SELECT - NOLOCK con SET TRANSACTION AISLAMIENTO NIVEL LEÍDO COMPROMETIDO
- 7. Cómo se asignan los eventos en .NET
- 8. ¿Por qué SQL Server se ralentiza cuando se usan variables?
- 9. tmux set -g ratón-select-ventana no trabaja
- 10. En ARC, ¿se copian automáticamente los bloques cuando se asignan a un ivar directamente?
- 11. ¿Cómo se asignan los subprocesos IIS7?
- 12. Donde se asignan los recursos no administrados
- 13. Procedimiento almacenado de SQL establece variables usando SELECT
- 14. ¿Establecer dos variables escalares en una instrucción SELECT?
- 15. ¿Cómo se implementa set()?
- 16. garantías cuando se utilizan variables de usuario al número filas
- 17. 1 instrucción SET para múltiples variables como declaración declare
- 18. _Expand versus new versus GNU
- 19. Toast versus Dialog boxes: ¿cuál usar cuando?
- 20. Los ID de recursos de Android se asignan incorrectamente
- 21. Declaración y configuración de variables en una instrucción Select
- 22. force get/set acceso de variables privadas para propiedades privadas
- 23. ¿Cómo se hace select select en gen_servers?
- 24. C número entero comportamiento de desbordamiento cuando se asignan a números enteros más grande de ancho
- 25. ¿Hay un gancho para cuando se asignan clases anónimas a una constante?
- 26. MySQL Variables de procedimiento almacenadas de las instrucciones SELECT
- 27. Select de SQL multi-columnas EN múltiples variables
- 28. nodo/expreso: set NODE_ENV cuando se utiliza siempre para ejecutar secuencias de comandos contínuamente
- 29. Android set (get) variables de entorno en Java
- 30. Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute
yo no Downvote, pero los siguientes no es del todo correcto: "En cuanto a las diferencias de velocidad - no hay diferencias directos entre SET y SELECT ". Si asigna valores múltiples en un slect, eso puede ser mucho más rápido que a través de conjuntos maultiple. Google up "Asignando múltiples variables con un SELECT funciona más rápido" –
@AlexKuznetsov: La frase luego dice exactamente eso. –
@OMG Ponies: puede ser 10 veces más rápido o más, por lo que no estoy seguro de si se trata de una "ligera ventaja de velocidad". –