문제

다음과 같이 SQL Server의 테이블 정의를 가정합니다.

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

그리고 쿼리 :

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

이 경우 Visual Studio 정적 코드 분석기는 다음 오류를 생성합니다.

경고 : SR0007 : Microsoft. 성능 : Nullable 열은 최종 결과가 술어에 대한 NULL로 평가 될 수 있습니다.

여기서는 문제가 보이지 않습니다. 오류는 성능과 관련이 있습니다. MSDN은 ISNULL ()을 사용해야한다고 말하지만 NULL에 대한 동등한 비교는 항상 거짓입니까? 내가 뭔가를 놓치고 있습니까, 아니면 경고가 잘못 되었습니까?

도움이 되었습니까?

해결책

나는 그것이 Where 절을 언급하고 있다고 생각합니다. 매개 변수와 열이 모두 null이 될 수 있으며,이 경우 위치 절이 더 이상 true/false로 평가하지 않습니다. 무효가 가능한 열을 항상 (ISNULL을 통해) 정의 된 값을 가진 열로 퍼지면 논리적으로 더 나은 모양이 더 좋습니다.

다음은 해당 오류에 대한 Microsoft 문서입니다.

제쳐두고, 널스는 아마도 Skosh가 느리게 쿼리를하게 할 것입니다.

다른 팁

분석기가 귀하의 IF 문을 고려하지 않을 것이라고 생각합니다.

당신의 코드는 나에게 올바른 것 같습니다.

나는 그것이 가짜 경고라고 생각합니다-당신은 케이스별로 그것을 완전히 억제 할 수 있습니까, 아니면 그 특정 경고를 완전히 억제 할 수 있습니까?

이렇게하면 어떻게됩니까? :

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

널 비교는 설정에 따라 다릅니다.

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

이것은 여기에서.

IF @id IS NOT NULL

교체해야합니다

IF ISNull(@id, -1) <> -1

@ raj : "if isnull (@id, -1) <> -1 인 경우"

실제로 테이블 항목을 대체하기 때문에 그렇게하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top