"CASE" 입력 표현식은 변하지 않아야 합니다

반응형

내부적으로는 단순 CASE 표현식이 검색된 CASE 표현식으로 평가됩니다. 그건,

CASE @foo
WHEN 1 THEN 'a'
WHEN 2 THEN 'b'

실제로는 다음과 같이 평가된다.

CASE
WHEN @foo = 1 THEN 'a'
WHEN @foo = 2 THEN 'b'

대부분의 상황에서 차이는 중요하지 않지만 입력 식이 고정되지 않은 경우(예: RAND()가 포함된 경우) 예상치 못한 결과가 발생할 가능성이 높습니다. 따라서 입력 표현식을 한 번 평가한 후 변수에 할당하고 해당 변수를 CASE의 입력 표현식으로 사용하는 것이 좋습니다.

이 규칙은 CASE 입력 표현식에 RAND, NEWID, CRYPT_GEN_RANDOM 중 하나가 사용될 때 문제를 발생시킵니다.

나쁜 예:

CASE CONVERT(SMALLINT, RAND()*@foo)  -- Noncompliant
WHEN 1 THEN 'a'
WHEN 2 THEN 'b'

좋은 예:

DECLARE @bar SMALLINT = CONVERT(SMALLINT, RAND()*@foo)
CASE @bar
WHEN 1 THEN 'a'
WHEN 2 THEN 'b'
반응형