存储过程GetTotalComp报错Msg 156:THEN关键字附近语法错误求助
解决SQL Server中Msg 156, Level 15, State 1语法错误(THEN关键字附近)
这个Msg 156, Level 15, State 1错误是SQL Server里非常常见的语法问题,从提示来看,你的存储过程GetTotalComp第19行的THEN关键字附近存在语法违规,大概率是CASE表达式的结构出了问题。下面我整理了最常见的几种错误场景以及对应的修复方案:
常见错误类型及修复示例
1. CASE表达式缺少WHEN条件
很多人会不小心写出没有WHEN就直接THEN的代码,比如:
-- 错误写法:直接跳到THEN,没有WHEN条件 CASE THEN Salary + Bonus END AS TotalComp
修复方法:补上对应的WHEN条件,必要时加上ELSE分支(虽然ELSE可选,但建议加上避免返回NULL):
CASE WHEN Bonus IS NOT NULL THEN Salary + Bonus ELSE Salary -- 可选但推荐的默认分支 END AS TotalComp
2. CASE表达式的基础结构错误
比如在简单CASE格式里多写了标点,或者结构混乱:
-- 错误写法:CASE后面的表达式后多了逗号 CASE EmployeeType, WHEN 'FullTime' THEN Salary + Bonus WHEN 'PartTime' THEN Salary END AS TotalComp
修复方法:去掉多余的标点,保证简单CASE的结构是CASE <目标表达式> WHEN <匹配值> THEN <结果> ... END:
CASE EmployeeType WHEN 'FullTime' THEN Salary + Bonus WHEN 'PartTime' THEN Salary END AS TotalComp
3. THEN后面没有有效返回表达式
如果THEN后面是空的,或者表达式本身有语法错误(比如未闭合的括号、不存在的列名),也会触发这个错误:
-- 错误写法:THEN后没有返回值 CASE WHEN Bonus > 0 THEN ELSE Salary END AS TotalComp
修复方法:给THEN补上合法的返回表达式:
CASE WHEN Bonus > 0 THEN Salary + Bonus ELSE Salary END AS TotalComp
针对你的存储过程的排查步骤
- 找到
GetTotalComp存储过程的第19行,仔细检查该行及上下1-2行的CASE表达式 - 确认CASE表达式符合两种合法格式之一:
- 简单CASE:针对某个表达式的固定值匹配
- 搜索CASE:针对多个独立条件判断
- 检查是否有拼写错误、多余的逗号/分号,或者未闭合的括号
如果能提供第19行附近的代码片段,我可以帮你更精准地定位问题,但按照经验,以上几种场景基本能覆盖你的问题。
内容的提问来源于stack exchange,提问作者Kurt Morrison
相关产品推荐
相关产品推荐

