¿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!



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

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

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')

10

Use TOP 1si la consulta devuelve varias filas.

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

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'

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.


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

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

"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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.