【发布时间】: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