복붙노트

[SQL] 변수를 할당 할 때 SELECT 대 SET?

SQL

변수를 할당 할 때 SELECT 대 SET?

는 SET과 SELECT 문 T-SQL에서 변수를 할당의 차이점은 무엇입니까?

해결법

  1. ==============================

    1.이 글에서 요약 한 견적 :

    이 글에서 요약 한 견적 :

  2. ==============================

    2.나는 선택이 아닌 반면, SET는 ANSI 표준을 믿습니다. 또한 값이 발견되지 않는 경우 아래의 예 SELECT 대 SET의 다른 동작을 확인합니다.

    나는 선택이 아닌 반면, SET는 ANSI 표준을 믿습니다. 또한 값이 발견되지 않는 경우 아래의 예 SELECT 대 SET의 다른 동작을 확인합니다.

    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' */
    
  3. ==============================

    3.쿼리를 작성하는 경우,이 차이는 명심해야한다 :

    쿼리를 작성하는 경우,이 차이는 명심해야한다 :

    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*/
    
  4. ==============================

    4.이외에도 ANSI 및 속도 등을되는 한에서, 항상 나에게 중요한 매우 중요한 차이가있다; ANSI 및 속도보다 더. 때문에이 중요한 간과 내가 해결 한 버그의 수는 크다. 나는 코드 리뷰하는 동안이 모든 시간을 찾습니다.

    이외에도 ANSI 및 속도 등을되는 한에서, 항상 나에게 중요한 매우 중요한 차이가있다; ANSI 및 속도보다 더. 때문에이 중요한 간과 내가 해결 한 버그의 수는 크다. 나는 코드 리뷰하는 동안이 모든 시간을 찾습니다.

    -- Arrange
    create table Employee (EmployeeId int);
    insert into dbo.Employee values (1);
    insert into dbo.Employee values (2);
    insert into dbo.Employee values (3);
    
    -- Act
    declare @employeeId int;
    select @employeeId = e.EmployeeId from dbo.Employee e;
    
    -- Assert
    -- This will print 3, the last EmployeeId from the query (an arbitrary value)
    -- Almost always, this is not what the developer was intending. 
    print @employeeId; 
    

    거의 항상, 그 개발자가 의도되는 것이 아닙니다. 위에서 쿼리는 정직하지만 매우 복잡하고 단일 값을 반환 여부, 사소한하지 않습니다 여부를 알아내는 있습니다 쿼리를 보았다. 쿼리는 종종 더 복잡한이보다 우연하여 단일 값을 반환하고있다. 모든 테스트를 개발하는 동안 괜찮습니다. 하지만이 시한 폭탄처럼 쿼리가 여러 결과를 반환 할 때 문제가 발생할 것입니다. 왜? 단순히 변수에 마지막 값을 할당합니다 때문입니다.

    이제 SET과 같은 일을 해보자 :

     -- Act
     set @employeeId = (select e.EmployeeId from dbo.Employee e);
    

    당신은 오류가 발생합니다 :

    왜 당신이 @employeeId에 "결과에서 마지막 항목"일부 사소한를 할당 할 것이기 때문에 그 놀라운 매우 중요하다. 어떤 오류가 발생하지 않습니다 선택하고 분을 보낼 것으로, 시간 디버깅.

    아마, 당신은 하나의 아이디를 찾고 있습니다 및 SET는 쿼리를 해결하기 위해 강제 것입니다. 따라서 당신이 뭔가를 같이 할 수 있습니다 :

    -- Act
    -- Notice the where clause
    set @employeeId = (select e.EmployeeId from dbo.Employee e where e.EmployeeId = 1);
    print @employeeId;
    

    대청소

    drop table Employee;
    

    결론적으로, 사용 :

  5. from https://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables by cc-by-sa and MIT license