2016-10-24 1 views
0

스토어드 프로 시저에서 기대하는 데이터를 가져 오는 데 문제가 있습니다. 이 프로시 저는 레코드 삽입 및 업데이트에 사용되며, 호출시 어떤 매개 변수가 설정되는지 결정합니다. 여기 내 예제는 DATE 유형 매개 변수에 NULL의 기본값이 있다고 가정합니다. 즉, SP에 전달되지 않았습니다. 다음과 같이 내가 해결하기보다는 전체 프로 시저 코드를 포함하는 작은 부분에 코드 분류했다 :저장된 프로 시저 내에서 SQL 중첩 된 사례 문

-- these would be sp parameters 
declare @CustomerId int = 15 
declare @Indicator varchar(5) = 'Yes' 
declare @ProjectTypeId tinyint = 1 
declare @FutureEffectiveDate as date = null 

     SELECT 
      CASE @FutureEffectiveDate 
       WHEN NULL THEN      
        CASE @Indicator 
         WHEN 'Yes' THEN 
          -- can only be 1, 2 or 3 to return relevant date 
          CASE @ProjectTypeId 
           WHEN 1 THEN DI.[NextFormalEffectiveDate] 
           WHEN 2 THEN DI.[NextInterimEffectiveDate] 
           WHEN 3 THEN DI.[NextAccountingEffectiveDate]        
          END 
         -- data should be NULL if @Indicator not 'Yes' 
         ELSE NULL 
        END 
       ELSE @FutureEffectiveDate 
      END AS [FutureEffectiveDate] 
     FROM 
      [_Staging].[DataImport_2] AS DI 
     JOIN 
      [CustomerView] AS CV ON CV.[CustomerNumber] = DI.[BillingInvoiced] 
     JOIN 
      [ProjectType] AS PT ON PT.[ProjectType] = DI.[ProjectType] 
     WHERE 
      CV.[CustomerID] = @CustomerId AND 
      PT.[ProjectTypeID] = @ProjectTypeId 

그래서 아이디어는, 그 필드가 텍스트 '예'를 포함 기록, 대한 해당 레코드의 프로젝트 유형에 따라 세 가지 날짜 중 하나를 선택합니다. 필드가 '예'가 아닌 경우 프로젝트 유형을 무시하고 NULL을 반환해야합니다. date 매개 변수가 null이 아니면 전달 된 매개 변수를 반환해야합니다. 결과는 'FutureEffectiveDate'열로 반환됩니다. 내가 가지고있는 예제 데이터를 가지고, 관련 필드가 'Yes'이고 NextFormalEffectiveDate 열의 값이 (프로젝트 유형이 1이므로) 반환 될 것으로 기대합니다.
이상하게도 바깥 쪽 CASE 문을 제외하면 제대로 작동합니다. 그래서 문제는 DATE 매개 변수를 기반으로 할 일을 결정하는 것이지만 외부 CASE 문이 결과를 왜 파손하는지 알 수 없습니다.

+0

NULL 당신이 당신의 날짜 매개 변수로 NULL을 전달 알고 있나요 비교하는 올바른 방법은 다음 IS 운영자

을 사용하여 비교해야 하는가? 빈 문자열로 전달되는 경우가 종종 있는데, 사람들은 실제로 1900-01-01 일 때 NULL이 될 것이라고 생각했습니다. –

+0

예, 여기서 의도는 sp가 내 UI와 데이터 가져 오기 프로세스에서 모두 사용할 수 있다는 것입니다. 두 개의 procs를 작성하는 대신 서명에서 널 (null)로 매개 변수를 기본 설정합니다. 따라서 매개 변수가 전달되지 않으면 sp 데이터베이스에서 이들을 읽고 UPDATE를 수행 할 수 있지만, 채워지면 INSERT 문에서 사용됩니다. – MartinS

답변

4

CASE 문에 NULL에 대한 @FutureEffectiveDate을 확인한 방법이 잘못되었습니다. 여기에 작은 데모가 있습니다

declare @FutureEffectiveDate as date = null 

Select Case @FutureEffectiveDate when NULL then 1 else 0 end 

위의 쿼리는 0이됩니다. 위의 CASE 문은 @FutureEffectiveDate = NULL과 같은 입력 식의 유효성을 검사하므로 실패합니다. NULL

SELECT CASE 
     WHEN @FutureEffectiveDate IS NULL THEN 
      CASE .. 
+0

나는 NULL 일 때 CASE @FutureEffectiveDate를 시도했지만 구문 오류가 발생하여 처음에는 데모를 보았지만 차이점을 볼 수 없었지만 WHEN에서 논쟁하는 것은 실제로 문제를 해결합니다. 발행물. 이 형식은 NULL과 비교할 때만 필요합니까? 다른 CASE 문에서 나는 CASE 인수를 사용할 때 XEN THEN ... END와 예상대로 작동합니다. – MartinS