2015-01-27 2 views
1

여러 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이 아님을 나타낼 수 있습니다. 나는 비슷한 것이나 똑같은 효과가있는 것을 기대하고있었습니다.

+0

그냥 추측하십시오 - 매개 변수에 기본값을 추가하면 도움이됩니까? '@FromDate DATE = NULL, ... ' – Keith

+0

@Keith : 첫 번째 시도에서 함수에서 작동하도록 기본값을 가져올 수 없습니다. 나는 여전히 모든 매개 변수를 전달해야했습니다. –

+0

SQL 함수의 기본 매개 변수는 반 직관적 인 IMHO입니다. 함수를 호출 할 때 각 매개 변수를 지정해야합니다. 그러나 나는이 접근법이 당신이 찾고있는 힌트를 코드 분석에 제공하기를 희망했다. – Keith

답변

1

오류 목록에서 경고를 마우스 오른쪽 단추로 클릭하고 "정적 코드 분석 메시지 표시 안 함"을 선택할 수 있습니다. 이렇게하면 특정 파일에서 SR0007 오류의 모든 경우가 표시되지 않습니다. 그것은 여전히 ​​다른 파일에서 제기 될 것입니다. 또는 이러한 경고를 보지 않으려면 프로젝트 속성에서 규칙을 비활성화하십시오.

편집 : 무슨 일 StaticCodeAnalysis.SuppressMessages.xml에 다음 항목이 만들어집니다라는 파일입니다

<!-- language: lang-xml --> 
<?xml version="1.0" encoding="utf-8" ?> 
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis"> 
    <SuppressedFile FilePath="DatabaseScalarFunction1.sql"> 
    <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0007" /> 
    </SuppressedFile> 
</StaticCodeAnalysis> 

이이 규칙에 의해 다음, 파일 이름을 먼저 표시 오류/경고를 필터링 볼 수 있듯이 신분증. 따라서 "DatabaseScalarFunction1.sql"파일에서 ID가 "SR0007"인 경고는 무시됩니다. 이 파일에 여러 프로 시저가있는 경우 모든 파일에 대한 경고가 무시됩니다.

+0

"해당 파일에서"무엇을 의미합니까? 저장 프로 시저 전체에서 의미합니까? 그 저장 프로 시저에서 여전히 SR0007의 합법적 인 사례를 놓치지 만 충분히 성공적으로 작동 할 것입니다. –

+1

나는 무슨 일이 일어나는가에 대한 설명을 추가했습니다 - 그것은 합법적 인 경우도 걸러 낸다는 것을 의미합니다. 기본 동작에 대한 수정을 요청하려면 규칙의 동작을 향상시키기 위해 Connect 버그를 여는 것이 좋습니다. https://connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx로 이동하여 "Developer 도구 (SSDT, BIDS 등) ". –

+0

고마워, 케빈.BTW 당신이 Microsoft에서 일하고 있다면, 귀하의 프로필에서 공개의 문제로 말할 수 있습니다. –

관련 문제