힌트 - sql server management studio 연결




하위 쿼리를 사용하여 SQL에 변수 할당 (2)

나는 2 SQL에 대한 질문이 :

declare @i1 bit, @b1 bit
declare @i2 bit, @b2 bit
declare @t table (Seq int)
insert into @t values (1)

-- verify data
select case when (select count(1) from @t n2 where 1 = 2) > 0 then 1 else 0 end
-- result 0

select @i1 = 1, @b1 = case when @i1 = 1 or ((select count(1) from @t n2 where 1 = 2) > 0) then 1 else 0 end from @t n where n.Seq = 1
select @i1, @b1
-- result 1, 0

select @i2 = 1, @b2 = case when @i2 = 1 or (0 > 0) then 1 else 0 end from @t n where n.Seq = 1
select @i2, @b2
-- result 1, 1

여기에 SQL 피들

실행하기 전에 case 부분이 null = 1 or (0 > 0) 이어야한다고 생각하고 null = 1 or (0 > 0) 을 반환합니다.

하지만 이제는 왜 2 번째 SQL이 1을 반환하는지 궁금합니다.


그냥 @ Giorgi의 대답을 연장하려면 :

이 실행 계획을 참조하십시오. @i2 가 먼저 평가되므로 (@ i2 = 1), case when @i2 = 1 or anything 1을 반환하는 경우.

이 msdn 항목을 참조하십시오. https://msdn.microsoft.com/en-us/library/ms187953.aspx주의 섹션

단일 SELECT 문에 여러 할당 절이있는 경우 SQL Server는 식의 평가 순서를 보장하지 않습니다. 과제 간의 참조가있는 경우에만 효과가 표시됩니다.

그것은 모두 내부 최적화와 관련이 있습니다.


두 가지 대답을 모두 확장하십시오.

CASE 표현의 더러운 비밀에서 :

CASE가 항상 단락되지는 않습니다.

공식 문서는 전체 표현이 단락 될 것이라는 것을 의미합니다. 즉, 왼쪽에서 오른쪽으로 표현식을 평가하고 일치하는 경우 평가를 중단합니다.

The CASE statement  evaluates its conditions sequentially and stops with the
first condition whose condition is satisfied.

그리고 MS Connect :

사례 Transact-SQL

CASE 문은 조건을 순차적으로 평가하고 조건이 만족되는 첫 번째 조건으로 중지합니다. 어떤 경우에는 CASE 문이 표현식의 결과를 입력으로 받기 전에 표현식이 평가됩니다. 이 표현식을 평가할 때 오류가 발생할 수 있습니다.





tsql