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

SQL Server存储过程执行报错:必须声明标量变量@FirstName

解决SQL Server存储过程中的Msg137错误及逻辑问题

我看到你遇到了Msg137的错误,提示必须声明标量变量@FirstName,但你明明已经在存储过程参数里声明了它。结合你的代码和错误信息,我发现两个关键问题:

1. 运算符优先级导致的逻辑歧义(可能间接引发错误)

你的WHERE子句里混合了AND和OR,但没有用括号明确分组逻辑。SQL Server中AND的优先级高于OR,所以当前的条件会被解析成:

([fName] = @FirstName AND [lName] = @LastName AND [mName] = @MiddleName AND @FirstName LIKE '%son%')
OR
(@LastName LIKE '%son%')

这大概率不是你想要的逻辑——它只会返回**(全名完全匹配且名字包含son)或者(姓氏包含son)的记录,而不是你可能期望的(全名完全匹配)或者(名字/姓氏包含son)**。

2. 错误的存储过程执行方式(直接引发Msg137)

Msg137的错误通常是因为在执行存储过程时,没有正确传递参数。比如:

  • 你可能漏写了参数前的@符号(比如写成FirstName='xxx'而不是@FirstName='xxx')
  • 你可能用了未声明的变量作为参数值(比如@FirstName=FirstName,但FirstName这个变量根本没定义)

修正后的存储过程代码

先调整WHERE子句的逻辑,用括号明确分组,确保符合你的业务需求(假设你想要的是“全名匹配”或者“名字/姓氏含son”):

CREATE PROCEDURE Example6 
    @FirstName VARCHAR(50), 
    @LastName VARCHAR(50), 
    @MiddleName VARCHAR(50) 
AS 
SELECT 
    [employee_id], [employee_type_id], [HR_status_id], [employer_id],
    [fName], [mName], [lName], [address], [city], [state_id], [zip],
    [hireDate], [currDate], [ssn], [ext_emp_id], [terminationDate], [dob],
    [initialMeasurmentEnd], [plan_year_id], [limbo_plan_year_id], [meas_plan_year_id],
    [modOn], [modBy], [plan_year_avg_hours], [limbo_plan_year_avg_hours],
    [meas_plan_year_avg_hours], [imp_plan_year_avg_hours], [classification_id],
    [aca_status_id], [ResourceId] 
FROM dbo.employee 
WHERE 
    -- 全名完全匹配
    ([fName] = @FirstName AND [lName] = @LastName AND [mName] = @MiddleName)
    -- 或者名字/姓氏包含son
    OR (@FirstName LIKE '%son%' OR @LastName LIKE '%son%');

正确的存储过程执行方式

确保执行时正确传递参数,两种方式都可以:

方式1:命名参数(推荐,可读性高)

EXEC Example6 
    @FirstName = 'John', 
    @LastName = 'Doe', 
    @MiddleName = 'Michael';

方式2:位置参数(按声明顺序传递)

EXEC Example6 'John', 'Doe', 'Michael';

这样调整后,既解决了逻辑歧义,也能避免Msg137的错误。

内容的提问来源于stack exchange,提问作者S.Vojnovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:45