Como definir variável de uma consulta SQL?

324

Estou tentando definir uma variável de uma consulta SQL:

declare @ModelID uniqueidentifer

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

Obviamente, não estou fazendo isso direito, pois não funciona. Alguém pode sugerir uma solução?

Obrigado!

Mr Cricket
fonte
2
É um identificador único. Não é um identificador único.
DxTx

Respostas:

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

Veja esta pergunta para saber a diferença entre o uso de SELECT e SET no TSQL .

Aviso

Se esta instrução select retornar vários valores (ruim para começar):

  • Ao usar SELECT, é atribuído à variável o último valor retornado (como o womp disse), sem nenhum erro ou aviso (isso pode causar erros de lógica)
  • Ao usar SET, ocorrerá um erro
Pôneis OMG
fonte
3
Se esta instrução select retornar múltiplos valores: no primeiro caso, é atribuído à variável o último valor retornado (como disse o womp), sem nenhum erro ou aviso (isso pode causar erros de lógica); no segundo caso, ocorrerá um erro.
Francis Niu
3
BTW, o caso usando SET precisa de um par de colchetes: SET @ModelID = (SELECT ...) #
Francis Niu #:
2
Eu usaria o TOP 1 com select, para ter apenas 1 resultado, por exemplo, SET @ModelID = (SELECT TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast')
TPAKTOPA
No caso de usar set quando vários valores forem retornados, como lidar com isso usando o tratamento de exceções?
aluno
Às vezes, você deseja um erro se houver um resultado duplicado inesperado em vez de usar silenciosamente um resultado inesperado.
Denise Skidmore
37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Se sua instrução select retornar vários valores, sua variável receberá o último valor retornado.

Para referência sobre o uso de SELECT com variáveis: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

womp
fonte
29
declare @ModelID uniqueidentifer

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

select @ModelID
greg121
fonte
Esta pergunta toda pronta tem uma resposta que não precisava ser respondida novamente. Não consigo nem ver o que há de diferente entre a sua e a resposta de Pôneis.
Joshua Duxbury
5
@JoshuaDuxbury ele fornece um trabalho versão copiar colar
greg121
17

Prefiro defini-lo a partir da declaração declare

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

Use TOP 1se a consulta retornar várias linhas.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
manu vijay
fonte
Não vai realmente causar um erro no SQL ele irá selecionar o último registro (embora possa causar um erro que resulta em um aplicativo se você estiver usando este valor e é incorreto)
D219
9

Você pode usar isso, mas lembre-se de que sua consulta fornece 1 resultado, vários resultados gerarão a exceção.

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

Outra maneira:

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

Nesse caso, se você tiver dois ou mais resultados retornados, seu resultado será o último registro. Portanto, esteja ciente disso se você tiver mais dois registros retornados, pois poderá não ver o resultado esperado.

Mohammad Farahani
fonte
4

Existem três abordagens:

  1. DECLARAR
  2. SET - Abordagem recomendada pela Microsoft
  3. SELECT

A consulta abaixo detalha as vantagens e desvantagens de cada um:

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

Para atribuir variáveis ​​usando um SQL, selecione a melhor prática, conforme mostrado abaixo

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

Se você precisar atribuir mais de uma variável em uma única linha, poderá usar o mesmo SELECT INTO

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

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

--HAPPY CODING-- 
Venkzz_venki
fonte
"melhores práticas" - fonte?
Rodney Ellis
Se você tiver mais de uma coluna para selecionar em uma tabela, poderá atribuí-la facilmente usando uma única instrução SELECT INTO em vez de repetir o código !!
Venkzz_venki