SQL 쿼리에서 변수를 설정하는 방법은 무엇입니까?


324

SQL 쿼리에서 변수를 설정하려고합니다.

declare @ModelID uniqueidentifer

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

분명히 나는 ​​그것이 작동하지 않기 때문에 이것을 올바르게하고 있지 않습니다. 누군가 해결책을 제안 할 수 있습니까?

감사!



2
고유 식별자입니다. 고유하지 않습니다.
DxTx

답변:


518

SELECT 사용 :

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

SET 사용 :

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

TSQL에서 SELECT와 SET을 사용하는 것의 차이점에 대해서는이 질문을 참조하십시오 .

경고

이 select 문이 여러 값을 반환 하는 경우 (시작하기에 나쁨) :

  • 를 사용할 때 SELECT변수에 오류나 경고없이 반환 된 마지막 값이 할당됩니다 (논리 버그가 발생할 수 있음)
  • 를 사용할 때 SET오류가 발생합니다

3
이 select 문이 여러 값을 반환하면 첫 번째 경우 변수에 오류나 경고없이 반환 된 마지막 값이 할당됩니다 (논리 버그가 발생할 수 있음). 두 번째 경우 오류가 발생합니다.
Francis Niu

3
BTW, SET을 사용하는 경우는 괄호 한 쌍의 필요 : SET @ModelID = (SELECT ...)
프랜시스 니우

2
난 단지 한 결과를 가지고 선택과 TOP 1을 사용하는 것, 예를 들어, SET @ModelID = (모델과 SELECT TOP 1 m.modelid은 WHERE가 m.areaid = '사우스 코스트'M)
TPAKTOPA

여러 값이 반환 될 때 set을 사용하는 경우 예외 처리를 사용하여 값을 처리하는 방법은 무엇입니까?
학습자

예기치 않은 결과를 자동으로 사용하지 않고 예기치 않은 중복 결과가있는 경우 때때로 오류가 발생합니다.
Denise Skidmore


29
declare @ModelID uniqueidentifer

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

select @ModelID

이 모든 준비가 완료된 질문에는 다시 답변 할 필요가없는 답변이 있습니다. 귀하의 질문과 Ponies 답변의 차이점을 알 수 없습니까?
Joshua Duxbury

5
@JoshuaDuxbury 그것은 작업 카피 붙여 넣기 버전을 제공합니다
greg121

17

선언문에서 설정하는 것을 선호합니다.

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

10

TOP 1쿼리가 여러 행을 반환하는 경우 사용하십시오 .

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

실제로는 SQL에서 오류가 발생하지 않으며 마지막 레코드를 선택합니다 (이 값을 사용하고 올바르지 않은 경우 응용 프로그램에서 결과 오류가 발생할 수 있음)
d219

9

이것을 사용할 수는 있지만 쿼리에서 1 개의 결과를 제공하면 여러 결과에서 예외가 발생합니다.

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

또 다른 방법:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'

4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

이 경우 두 개 이상의 결과가 반환되면 결과가 마지막 레코드입니다. 따라서 예상 결과가 표시되지 않을 때 두 개의 레코드가 더 리턴 될 경우이를 인식하십시오.


4

세 가지 접근 방식이 있습니다.

  1. 알리다
  2. SET -Microsoft 권장 접근 방식
  3. 고르다

아래 쿼리는 각각의 장단점을 자세히 설명합니다.

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

SQL을 사용하여 변수를 할당하려면 다음과 같이 모범 사례를 선택하십시오.

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

한 줄에 둘 이상의 변수를 할당해야하는 경우 동일한 SELECT INTO를 사용할 수 있습니다

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

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

--HAPPY CODING-- 

"모범 사례"-출처?
로드니 엘리스

테이블에서 선택할 열이 두 개 이상인 경우 코드를 반복하는 대신 단일 SELECT INTO 문을 사용하여 열을 쉽게 할당 할 수 있습니다 !!
Venkzz_venki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.