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

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

关键修改点说明

  1. CASE表达式重构:将原错误的THEN ... OR/AND ...结构拆分为标准的WHEN 条件 THEN 结果链式结构,按优先级匹配业务规则(你可以根据实际业务调整条件的顺序)。
  2. 重复列处理:
    • 把RIGHT(EQUIPMENT.UserStatus, 3)重命名为Saty_Substring,避免与EQUIPMENT.Saty重复。
    • 合并了两个Location的CASE逻辑为一个,避免重复列。
    • 给EQUIPMENT.Location添加别名Original_Location,区分我们自定义的Location列。
  3. 增加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:12:47