2015-01-13 21 views
0

에서 ELSE를 건너 뛰는 :Case 문은 항상이 같은 SQL 저장 프로 시저에 삽입하는 동안 CASE 문을 사용하려고 저장 프로 시저

INSERT INTO [dbo].[OfferPrice] 
      (OfferId,Price,DefaultPrice,SalePrice, 
      SaleFromDate,SaleToDate) 
SELECT tvp.OfferId AS OfferId, 
     CASE 
     WHEN @Price IS NOT NULL THEN @Price 
     WHEN @Price IS NULL 
       AND tvp.SalePrice IS NOT NULL 
       AND Getutcdate() >= tvp.SaleFromDate 
       AND Getutcdate() < tvp.SaleToDate THEN tvp.SalePrice 
     WHEN @Price IS NULL 
       AND tvp.SalePrice IS NULL THEN tvp.DefaultPrice 
     ELSE 0 
     END AS Price, 
     tvp.DefaultPrice AS DefaultPrice, 
     tvp.SalePrice AS SalePrice, 
     tvp.SaleFromDate AS SaleFromDate, 
     tvp.SaleToDate AS SaleToDate 
FROM @OfferPriceTVP tvp 
     LEFT JOIN [dbo].OfferPrice dop 
       ON dop.OfferId = tvp.OfferId 
WHERE dop.OfferId IS NULL 

문제가 있음을 CASE 것은 항상 ELSE 경우에도 이전 문에 건너 뛰는 사실입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 :

이 @OfferPriceTVP입니다 :

CREATE TYPE [dbo].[TVP_OfferPrice] AS TABLE 
(
    OfferId INT NOT NULL PRIMARY KEY, CountryId INT NOT NULL, VatRateId INT, DefaultPrice decimal(16, 4), SalePrice decimal(16, 4), 
    SaleFromDate datetime, SaleToDate datetime 
); 

그리고 여기에 내가 지금하려고했던 삽입 (그것은 바로 기본값으로 가격을 설정해야 어떤 날짜가 없더라도?) :

DECLARE @OfferPriceTVP AS [dbo].[TVP_OfferPrice] 
INSERT INTO @OfferPriceTVP (OfferId,CountryId,VatRateId,DefaultPrice,SalePrice,SaleFromDate,SaleToDate) 
VALUES (10006805,2,1,1,1,NULL,NULL), 
(10006806,1,1,2,1,NULL,NULL), 
(10006807,1,1,3,1,NULL,NULL), 
(10006808,1,1,4,1,NULL,NULL), 
(10006809,1,1,5,1,NULL,NULL), 
(10006810,1,1,6,2,NULL,NULL); 
EXEC [dbo].[TVP_OfferPrice] @OfferPriceTVP; 
GO 
+1

제안 할 수있다. FYI'case'는 모든 조건이 실패했을 때만'else' 부분으로갑니다 –

+0

@Price가 매개 변수로 정의되어 있습니까? –

+0

이 '사례'* 표현에 대해 추론 할 가장 중요한 두 가지 사항은 우리에게 알려주지 않은 '@ Price' 및'@ OfferPriceTVP'변수의 내용 일 것입니다. –

답변

0

NULL과의 비교는 항상 거짓입니다. 귀하의 테이블에는 판매 날짜가 없습니다. 판매 기간 확인

Getutcdate() >= tvp.SaleFromDate AND Getutcdate() < tvp.SaleToDate

은 항상 실패합니다.

즉, @Price이 NULL이고 SalePrice이 아닌 경우 ELSE 문만 유효합니다.

+0

내 나쁜 아침에 이른 것 같아. – kali

1

아마도 판매일이 없으면 판매 가격 (사용 가능한 경우) 또는 기본 가격 중 하나를 취하는 것이 좋습니다. 그런 경우에는

후 바로 세 번째 WHENSalePrice IS NULL 검사를 생략하고 COALESCE을 사용 : 데이터 아무것도보고하지 않고

CASE 
    WHEN @Price IS NOT NULL THEN @Price 
    WHEN @Price IS NULL 
      AND tvp.SalePrice IS NOT NULL 
      AND Getutcdate() >= tvp.SaleFromDate 
      AND Getutcdate() < tvp.SaleToDate THEN tvp.SalePrice 
    WHEN @Price IS NULL 
      THEN COALESCE(tvp.SalePrice,tvp.DefaultPrice) 
    ELSE 0 
    END AS Price