【问题标题】:Case statement always skipping to ELSE in stored procedure存储过程中的 case 语句总是跳到 ELSE
【发布时间】:2015-01-13 08:05:10
【问题描述】:

我试图在插入 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

【问题讨论】:

  • 没有看到数据就没有任何建议。仅供参考 case 将转到 else 部分仅当所有条件都失败时
  • @Price 在某处被定义为参数?
  • 看来我们要知道关于这个CASE 表达式 的两个最重要的事情是@Price@OfferPriceTVP 的内容变量 - 你没有向我们展示。
  • @Damien_The_Unbeliever 很明显,@Price 为空,tvp.SalePrice 不是,否则其他情况之一将运行。这意味着日期检查失败 - GETUTCDATE() 不在记录的销售期内。
  • 重要的值是SaleFromDate,SaleToDate的内容。它们是否包含涵盖查询运行时间的有效时段?期间是否使用 UTC 时间记录,或者是否存在偏移不匹配导致销售期前几个小时出现问题?

标签: sql sql-server-2008 stored-procedures case table-valued-parameters


【解决方案1】:

我认为,如果没有销售日期,您的意图可能是采用销售价格(如果有)或默认价格。

如果是这种情况,那么只需在第三个WHEN 中省略SalePrice 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

【讨论】:

    【解决方案2】:

    与 NULL 的比较总是错误的。您的表不包含销售日期。销售期间检查

    Getutcdate() &gt;= tvp.SaleFromDate AND Getutcdate() &lt; tvp.SaleToDate

    总会失败。

    这意味着如果@Price 为NULL 而SalePrice 不是,则只有ELSE 语句有效。

    【讨论】:

    • 我的错我猜到凌晨
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多