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

SQL执行报Msg 156错误:ELSE关键字附近语法错误问题咨询

错误原因排查
  • 核心语法错误:SQL中IF-ELSE的配对规则是每个ELSE只能和最近一个未配对的IF绑定,你的代码里写了两个并列的独立IF语句:
    1. 第一个IF @OTHours = @HolHours结束后没有对应的ELSE,直接声明了第二个独立的IF @RegHours > @TotHours
    2. 第二个IF已经配对了一个ELSE块,后面额外多出来的ELSE PRINT 'This week had no holiday pay.'找不到对应的IF绑定,直接触发语法错误
  • 其他隐藏逻辑问题:
    1. 变量@OTHours声明为time类型,但你用它和decimal类型的@HolHours做等值判断,类型不匹配会导致后续执行报错
    2. @OTHours全程没有赋值,默认值为NULL,所有涉及@OTHours的判断都会返回未知,无法触发预期逻辑
修复方案

按照你提到的「最后一个ELSE是第一个条件不成立时的返回结果」的需求,需要把第二个IF嵌套到第一个IF的成立分支内,修正后的完整代码如下:

USE PR;

DECLARE @TotHours decimal;
DECLARE @TotEmps int;
DECLARE @HolHours decimal;
DECLARE @RegHours decimal;
DECLARE @OTHours decimal; -- 修正变量类型为decimal,和其他时长统计变量类型匹配

SELECT @TotHours = SUM(WorkHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SELECT @TotEmps = COUNT(EmpID) FROM EmpData;

SELECT @HolHours = SUM(HolHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

-- 新增@OTHours赋值逻辑,可根据实际业务调整取值规则
SELECT @OTHours = SUM(OTHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SET @RegHours = @TotEmps * 32;

IF @OTHours = @HolHours
BEGIN
    SELECT *
    FROM Hours           
    WHERE @OTHours > 0; 

    -- 第二个IF嵌套到第一个IF的成立分支内
    IF @RegHours > @TotHours
    BEGIN
        SELECT *
        FROM Hours
        WHERE @OTHours = @HolHours AND @RegHours = @TotEmps * 32;

        PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
        PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
        PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
    END;
    ELSE
    BEGIN
        SELECT @TOtHours - MAX(@RegHours) AS OTHours
        FROM Hours;

        PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
        PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
        PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
    END;
END;
-- 该ELSE对应第一个IF,符合预期逻辑
ELSE
    PRINT 'This week had no holiday pay.';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:10