여러 WHERE 절에서 반복되는 술어가 있으므로 "영리하게"리터럴 화하여 스칼라 반환 함수함수에 Nullable 열을 전달하면 경고가 발생 함 SR0007 - 함수가 COALESCE 및 ISNULL을 사용하더라도
CREATE FUNCTION dbo.IsCurrent
(
@FromDate DATE,
@ToDate DATE,
@AsOfDate DATE
)
RETURNS INT
AS
BEGIN
DECLARE @Today DATE;
SET @Today = COALESCE(@AsOfDate, GETDATE());
RETURN
CASE
WHEN @Today BETWEEN ISNULL(@FromDate,'1900-01-01') AND ISNULL(@ToDate, DATEADD(dd, 1, @Today))
THEN 1
ELSE 0
END;
END
당신이 볼 수 있듯이 는 기능 는이 매개 변수 중 하나에 대해 NULL 값이 전달 될 것으로 기대하고 올바르게 처리합니다. 항상 생산할 예정 중 1 또는 0
하지만 매개 변수 중 하나로서 널 (NULL) 컬럼을 통과, 그 함수를 호출 할 때, 나는 코드 분석에서 SR0007 경고 얻을 :
SR0007 : 마이크로 소프트. Rules.Data : Null 가능한 열로 인해 술어에 대한 최종 결과가 NULL로 평가 될 수 있습니다.
이 특정 기능에 대한 호출에서 이러한 경고가 나타나지 않도록하려면 어떻게해야합니까? 내가 바꾼 코드에 대해 코드 분석 경고가 없다는 규칙을 채택했습니다. SSDT 코드 분석을 종료하기 위해 매개 변수에 ISNULL
을 사용할 필요가 없기를 바랍니다. 제가 "힌트를 줄 수있는"방법이 있습니까?
내가 "힌트를 줘"라고 말했을 때, 나는 ReSharper가 어떻게 작동하는지 생각하고있었습니다. 어떤 경고가 어느 정도 심각하게 나타나는지 제어 할 수있을뿐만 아니라 경고의 특정 인스턴스를 비활성화하거나 코드의 플러그 또는 의견을 사용하거나 주석을 사용할 수 있습니다. 예를 들어, 매개 변수에 [NotNull]
주석을 넣어서 결코 null이 아님을 나타낼 수 있습니다. 나는 비슷한 것이나 똑같은 효과가있는 것을 기대하고있었습니다.
그냥 추측하십시오 - 매개 변수에 기본값을 추가하면 도움이됩니까? '@FromDate DATE = NULL, ... ' – Keith
@Keith : 첫 번째 시도에서 함수에서 작동하도록 기본값을 가져올 수 없습니다. 나는 여전히 모든 매개 변수를 전달해야했습니다. –
SQL 함수의 기본 매개 변수는 반 직관적 인 IMHO입니다. 함수를 호출 할 때 각 매개 변수를 지정해야합니다. 그러나 나는이 접근법이 당신이 찾고있는 힌트를 코드 분석에 제공하기를 희망했다. – Keith