SQL存储过程语法错误求助:关键字'OR'附近存在语法错误
存储过程语法错误排查与修正
核心错误分析
你遇到的消息156,级别15,状态1错误,根源是CASE表达式的语法使用错误,同时还有重复列名、逻辑运算符误用的问题:
- CASE语句的标准语法是
CASE WHEN 条件 THEN 结果 [WHEN 条件 THEN 结果 ...] [ELSE 默认值] END,你错误地在THEN后直接用OR/AND连接其他WHEN条件,这不符合SQL语法规范。 - SELECT列表中存在重复列(
Saty、UserStatus、Location各出现两次),会导致插入时与目标表GeneralInfo的列结构不匹配,引发额外错误。 - 原CASE中的括号与逻辑运算符组合混乱,业务逻辑表达不清晰。
修正后的存储过程代码
我根据你原代码的业务意图,重新梳理了CASE逻辑,并修正了所有语法问题:
ALTER PROCEDURE [dbo].[sp_GeneralInfo]( @Equipment float) AS BEGIN INSERT INTO GeneralInfo SELECT EQUIPMENT.Equipment, EQUIPMENT.Description, RIGHT(EQUIPMENT.UserStatus, 3) AS Saty_Substring, -- 给重复逻辑的列取新别名 EQUIPMENT.UserStatus, -- 修正后的CASE表达式:按优先级匹配UserStatus的子串 CASE WHEN EQUIPMENT.UserStatus LIKE '%RNT%' THEN 'RENTAL' WHEN EQUIPMENT.UserStatus LIKE '%T&M%' THEN 'T&M' WHEN EQUIPMENT.UserStatus LIKE '%ORS%' THEN 'FSMA' WHEN EQUIPMENT.UserStatus LIKE '%INT%' THEN 'Internal Use' WHEN EQUIPMENT.UserStatus LIKE '%DEMO%' THEN 'DEMO' WHEN EQUIPMENT.UserStatus LIKE '%LOAN%' THEN 'LOAN' ELSE NULL -- 增加默认值,避免NULL隐式转换问题 END AS Saty_Type, -- 合并Location的CASE逻辑,避免重复列 CASE WHEN EQUIPMENT.UserStatus LIKE '%MTR%' THEN 'METRO' WHEN EQUIPMENT.UserStatus LIKE '%RMT%' THEN 'REMOTE' ELSE NULL END AS Location, EQUIPMENT.Saty, EQUIPMENT.ObjectType, EQUIPMENT.PG, ZSMR056.SDM, EQUIPMENT.AccountCategory, EQUIPMENT.Location AS Original_Location, -- 区分自定义的Location列 ZSMR056.ServiceCa, EQUIPMENT.CurrentMeter FROM EQUIPMENT INNER JOIN ZSMR056 ON EQUIPMENT.Equipment = ZSMR056.Equipment WHERE EQUIPMENT.proses = 0 AND ZSMR056.proses = 0 END
关键修改点说明
- CASE表达式重构:将原错误的
THEN ... OR/AND ...结构拆分为标准的WHEN 条件 THEN 结果链式结构,按优先级匹配业务规则(你可以根据实际业务调整条件的顺序)。 - 重复列处理:
- 把
RIGHT(EQUIPMENT.UserStatus, 3)重命名为Saty_Substring,避免与EQUIPMENT.Saty重复。 - 合并了两个Location的CASE逻辑为一个,避免重复列。
- 给
EQUIPMENT.Location添加别名Original_Location,区分我们自定义的Location列。
- 把
- 增加ELSE分支:为每个CASE添加
ELSE NULL,明确默认值,避免因无匹配条件返回NULL时的隐式问题。
如果你的业务逻辑中存在“同时满足多个条件”的场景(比如UserStatus同时包含'T&M'和'ORS'时返回特定值),可以调整CASE为嵌套结构,比如:
CASE WHEN EQUIPMENT.UserStatus LIKE '%RNT%' THEN 'RENTAL' WHEN EQUIPMENT.UserStatus LIKE '%T&M%' THEN CASE WHEN EQUIPMENT.UserStatus LIKE '%ORS%' THEN 'FSMA' WHEN EQUIPMENT.UserStatus LIKE '%INT%' THEN 'Internal Use' ELSE 'T&M' END WHEN EQUIPMENT.UserStatus LIKE '%DEMO%' AND EQUIPMENT.UserStatus LIKE '%LOAN%' THEN 'DEMO_LOAN' ... END
内容的提问来源于stack exchange,提问作者Indry
相关产品推荐
相关产品推荐

