2010-10-15 13 views

Respuesta

338

Quote, que resume de this article:

  1. SET es el estándar ANSI para la asignación de variables, SELECT no lo es.
  2. SET solo puede asignar una variable a la vez, SELECT puede realizar múltiples asignaciones a la vez.
  3. 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)
  4. 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)
  5. 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.
+3

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" –

+11

@AlexKuznetsov: La frase luego dice exactamente eso. –

+1

@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". –

121

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' */ 
+4

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 –

+4

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

+4

@Zack Has perdido completamente el punto del ejemplo. –

16

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*/ 
+0

muy agradable, sucinto – SimplyInk

Cuestiones relacionadas