SQL执行报Msg 156错误:ELSE关键字附近语法错误问题咨询
错误原因排查
- 核心语法错误:SQL中
IF-ELSE的配对规则是每个ELSE只能和最近一个未配对的IF绑定,你的代码里写了两个并列的独立IF语句:- 第一个
IF @OTHours = @HolHours结束后没有对应的ELSE,直接声明了第二个独立的IF @RegHours > @TotHours - 第二个IF已经配对了一个ELSE块,后面额外多出来的
ELSE PRINT 'This week had no holiday pay.'找不到对应的IF绑定,直接触发语法错误
- 第一个
- 其他隐藏逻辑问题:
- 变量
@OTHours声明为time类型,但你用它和decimal类型的@HolHours做等值判断,类型不匹配会导致后续执行报错 @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
相关产品推荐
相关产品推荐

