【问题标题】:Must declare the scalar variable (Stored procedure)必须声明标量变量(存储过程)
【发布时间】:2016-04-17 05:11:10
【问题描述】:

我在某些页面中看到了这个错误,但就我而言,我在这里找不到问题。

执行我的程序时出现错误。

exec sp_executesql N' EXEC UpdateEmployee @EmployeeID, @Status ',N'@EmployeeID bigint,@Status int',@EmployeeID=2,@Status=5

CREATE PROCEDURE UpdateEmployee
(
    @EmployeeID BIGINT,
    @StatusID int
)
AS

IF @StatusID = 0
BEGIN
    SET @StatusID = null
END 

UPDATE Employee SET StatusID = @StatusID WHERE EmployeeID = @EmployeeID
GO

我收到以下错误:

Msg 137, Level 15, State 2, Line 1 必须声明标量变量 “@StatusID”。

表employee上我的字段StatusID是int类型并且可以为空

我没有忘记声明变量。事实上,它是我的程序的一个 IN 参数。那么,怎么了?


更新 - 已修复

我意识到问题来自库生成的查询。我使用的是参数@Status 而不是@StatusID。这就是问题所在。感谢您的帮助。

【问题讨论】:

  • 为什么要使用动态 sql 执行 sp?你可以像这样执行它 - exec UpdateEmployee @EmployeeID=2,@StatusID=5
  • 这是一个ORM库生成的输出
  • 右键单击 SSMS 中的过程并选择执行。传递参数,看看会发生什么。

标签: sql-server stored-procedures scalar


【解决方案1】:

您在多语句 SP 主体周围缺少必需的 BEGIN ... END。此代码工作正常:

create table Employee (
    StatusID int,
    EmployeeID  int
)
go

CREATE PROCEDURE UpdateEmployee
(
    @EmployeeID BIGINT,
    @StatusID int
)
AS
begin
    IF @StatusID = 0
    BEGIN
        SET @StatusID = null
    END 

    UPDATE Employee SET StatusID = @StatusID WHERE EmployeeID = @EmployeeID
end
GO

exec UpdateEmployee 0,0
go

【讨论】:

  • 我添加了开始/结束,但没有任何反应。很奇怪。
【解决方案2】:

你的 proc 没有问题,它是如何执行的。 由于您是动态执行它,因此您必须声明您在动态查询中传递的参数。

这样执行

exec sp_executesql N' EXEC UpdateEmployee 2, 5 '

【讨论】:

    【解决方案3】:

    试试这个:

    CREATE PROCEDURE UpdateEmployee
    (
        @EmployeeID BIGINT,
        @StatusID int
    )
    AS
    UPDATE Employee SET StatusID = NullIf( @StatusID, 0 ) WHERE EmployeeID = @EmployeeID
    GO
    

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多