¿Cómo establecer la variable desde una consulta SQL?

324

Estoy tratando de establecer una variable a partir de una consulta SQL:

declare @ModelID uniqueidentifer

Select @ModelID = select modelid from models
where areaid = 'South Coast'

Obviamente no estoy haciendo esto bien, ya que no funciona. ¿Alguien puede sugerir una solución?

¡Gracias!

Mr Cricket
fuente
2
Es un identificador único. No únicoidentifer.
DxTx

Respuestas:

519

Usando SELECT:

SELECT @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

Usando SET:

SET @ModelID = (SELECT m.modelid 
                  FROM MODELS m
                 WHERE m.areaid = 'South Coast')

Consulte esta pregunta para ver la diferencia entre usar SELECT y SET en TSQL .

Advertencia

Si esta instrucción select devuelve múltiples valores (malos para empezar):

  • Cuando se usa SELECT, a la variable se le asigna el último valor que se devuelve (como dijo womp), sin ningún error o advertencia (esto puede causar errores lógicos)
  • Al usar SET, se producirá un error
Ponis OMG
fuente
3
Si esta instrucción select devuelve múltiples valores: en el primer caso, a la variable se le asigna el último valor que se devuelve (como dijo womp), sin ningún error o advertencia (esto puede causar errores lógicos); en el segundo caso, se producirá un error.
Francis Niu
3
Por cierto, el caso con SET necesita un par de paréntesis: SET @ModelID = (SELECT ...)
Francis Niu
2
Usaría TOP 1 con select, para tener solo 1 resultado, por ejemplo, SET @ModelID = (SELECT TOP 1 m.modelid DESDE MODELOS m WHERE m.areaid = 'South Coast')
TPAKTOPA
En el caso de usar set cuando se devuelven varios valores, ¿cómo manejarlo usando el manejo de excepciones?
alumno
A veces, desea un error si hay un resultado duplicado inesperado en lugar de usar un resultado inesperado en silencio.
Denise Skidmore
29
declare @ModelID uniqueidentifer

--make sure to use brackets
set @ModelID = (select modelid from models
where areaid = 'South Coast')

select @ModelID
greg121
fuente
Esta pregunta lista tiene una respuesta que no necesitó responder de nuevo, ¿ni siquiera puedo ver qué hay de diferente entre la tuya y la de Ponis?
Joshua Duxbury
55
@JoshuaDuxbury proporciona una versión de copiar y pegar que funciona
greg121
17

Prefiero simplemente configurarlo desde la declaración de declaración

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')
Joshua Duxbury
fuente
10

Use TOP 1si la consulta devuelve varias filas.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
manu vijay
fuente
En realidad, no causará un error en SQL, seleccionará el último registro (aunque podría causar un error resultante en una aplicación si está utilizando este valor y es incorrecto)
d219
9

Puede usar esto, pero recuerde que su consulta da 1 resultado, múltiples resultados arrojarán la excepción.

declare @ModelID uniqueidentifer
Set @ModelID = (select Top(1) modelid from models where areaid = 'South Coast')

De otra manera:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
Pranay_Sharma_Ind
fuente
4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

En este caso, si tiene dos o más resultados devueltos, entonces su resultado es el último registro. Por lo tanto, tenga en cuenta esto si tiene dos registros más devueltos ya que es posible que no vea el resultado esperado.

Mohammad Farahani
fuente
4

Hay tres enfoques:

  1. DECLARAR
  2. SET : enfoque recomendado de Microsoft
  3. SELECCIONE

A continuación, la consulta detalla las ventajas y desventajas de cada una:

-- First way, 
DECLARE @test int = (SELECT 1)
       , @test2 int = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- advantage: declare and set in the same place
-- Disadvantage: can be used only during declaration. cannot be used later

-- Second way
DECLARE @test int  
       , @test2 int 

SET @test = (select 1)
SET @test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: ANSI standard. 
-- Disadvantage: cannot set more than one variable at a time

-- Third way
DECLARE @test int, @test2 int 
SELECT @test = (select 1)
      ,@test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: Can set more than one variable at a time
-- Disadvantage: Not ANSI standard
Venkataraman R
fuente
1

Para ASIGNAR variables usando un SQL, seleccione la mejor práctica como se muestra a continuación

->DECLARE co_id INT ;
->DECLARE sname VARCHAR(10) ;

->SELECT course_id INTO co_id FROM course_details ;
->SELECT student_name INTO sname FROM course_details;

SI tiene que asignar más de una variable en una sola línea, puede usar esta misma SELECCIONAR EN

->DECLARE val1 int;
->DECLARE val2 int;

->SELECT student__id,student_name INTO val1,val2 FROM student_details;

--HAPPY CODING-- 
Venkzz_venki
fuente
"mejor práctica" - fuente?
Rodney Ellis
¡SI tiene más de una columna para seleccionar de una Tabla, entonces puede asignarla fácilmente usando una sola instrucción SELECT INTO en lugar de repetir el código!
Venkzz_venki