You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程WHERE子句用CASE表达式报错排查

问题原因与解决办法

语法错误根源

SQL Server 的 CASE 表达式仅支持返回单个标量值(如数字、字符串),不能直接返回 HotelID = @hotelid AND ... 这类布尔逻辑表达式。而 SQLite 允许这种非标准写法,这是跨数据库的语法差异导致的报错。

修正后的存储过程

你需要用标准的逻辑运算符(AND/OR)结合参数非空判断来重构 WHERE 子句,替代原来的 CASE 写法。以下是修正后的代码:

CREATE PROCEDURE usp_UpdateRackRates
    @hotelid smallint,
    @roomtypeid smallint = NULL,
    @rackratedescription varchar(200) = NULL,
    @percent decimal(6,4)
AS
    UPDATE RACKRATE 
    SET RackRate = CASE 
                       WHEN @percent >= 0 
                           THEN CEILING(RackRate * ((100 + @percent)/100))
                       ELSE FLOOR(RackRate * ((100 + @percent)/100))
                   END
    WHERE 
        HotelID = @hotelid
        AND (@roomtypeid IS NULL OR RoomTypeID = @roomtypeid)
        AND (@rackratedescription IS NULL OR RackRateDescription = @rackratedescription);

逻辑说明

  • 基础条件:必须匹配 HotelID = @hotelid(因为 @hotelid 是必填参数,无默认值)
  • 可选条件:如果传入了 @roomtypeid,则额外匹配房间类型;如果传入了 @rackratedescription,则额外匹配描述内容
  • 这种写法既符合 SQL Server 的语法规范,也能实现你原 CASE 语句想要的动态过滤逻辑

额外提示

原代码中 CASE 逻辑存在一处疏漏:当 @roomtypeid 不为空时,并没有在过滤条件中使用该参数,修正后的代码补上了这个逻辑,如果你原本不需要过滤房间类型,可以根据需求调整。

内容的提问来源于stack exchange,提问作者The Mungler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:36:29