스토어드 프로 시저에서 기대하는 데이터를 가져 오는 데 문제가 있습니다. 이 프로시 저는 레코드 삽입 및 업데이트에 사용되며, 호출시 어떤 매개 변수가 설정되는지 결정합니다. 여기 내 예제는 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 문이 결과를 왜 파손하는지 알 수 없습니다.
NULL
당신이 당신의 날짜 매개 변수로 NULL을 전달 알고 있나요 비교하는 올바른 방법은 다음IS
운영자을 사용하여 비교해야 하는가? 빈 문자열로 전달되는 경우가 종종 있는데, 사람들은 실제로 1900-01-01 일 때 NULL이 될 것이라고 생각했습니다. –
예, 여기서 의도는 sp가 내 UI와 데이터 가져 오기 프로세스에서 모두 사용할 수 있다는 것입니다. 두 개의 procs를 작성하는 대신 서명에서 널 (null)로 매개 변수를 기본 설정합니다. 따라서 매개 변수가 전달되지 않으면 sp 데이터베이스에서 이들을 읽고 UPDATE를 수행 할 수 있지만, 채워지면 INSERT 문에서 사용됩니다. – MartinS