"COALESCE", "IIF" 및 "CASE" 입력 표현식에는 하위 쿼리가 포함되어서는 안 됩니다

반응형

COALESCE 및 IIF(내부적으로 CASE 표현식으로 평가)와 CASE 입력 표현식은 하위 쿼리와 함께 사용하면 안 됩니다. 하위 쿼리는 표현식의 각 옵션에 대해 한 번만 평가되고 각 평가는 옵션에 따라 다른 결과를 반환할 수 있기 때문입니다. 격리 수준. 일관된 결과를 보장하려면 SNAPSHOT ISOLATION 격리 수준을 사용하세요. 일관된 결과  더 나은 성능을 보장하려면   하위 쿼리를 표현식 밖으로 이동하세요.

COALESCE를 ISNULL로 바꾸는 옵션이기도 합니다.

나쁜 예:

CASE
WHEN (SELECT COUNT(*) FROM A) > 0 THEN (SELECT COUNT(*) FROM A) + 42
...
ELSE otherExpression
END

좋은 예:

SET @a = SELECT COUNT(*) FROM A

CASE
WHEN @a > 0 THEN @a + 42
...
ELSE otherExpression
END

또는

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION
...
COALESCE((SELECT a FROM b WHERE c) , 1)
...
반응형