【问题标题】:"Must declare the scalar variable" error when executing a stored procedure执行存储过程时出现“必须声明标量变量”错误
【发布时间】:2017-01-11 15:22:56
【问题描述】:

我已尝试制作一个插入价格的程序:

create procedure prInsertPrice
@NuggetID varchar(5),
@Unit_Price money,
@Start_Date datetime,
@End_Date datetime
as
begin
DECLARE @date AS DATETIME
SET @date = GETDATE()
    if
        (
        (@NuggetID like 'N[0-9][0-9]')
        and
        (@Unit_Price is not null)
        and
        (@Start_Date is not null)
        )
    begin
        print 'Insert Success'
        insert NuggetPrice (NuggetId, Unit_Price, Start_Date, End_Date)
        values (@NuggetID, @Unit_Price, @Start_Date, @End_Date)
    end
    else
    begin
        print 'Failed to insert'
    end
end

当我执行程序时很好,但是当我像这样运行程序时:

EXEC prInsertPrice 'N01', 20000, @date, null

我收到错误消息:

必须声明标量变量@date。

为什么会这样,我该如何解决这个问题?

【问题讨论】:

  • 错误信息很清楚,您必须添加DECLARE @date datetime 并在运行exec 的同一批次中设置此变量。
  • 在我们给出可接受的答案之前,了解您正在尝试做什么有时会有所帮助。所以... 您在这里的意图是什么?您希望发生什么?
  • 我正在尝试创建一个程序,该程序将能够根据程序的内容进行插入。那么这里我有一个变量声明的问题,我需要使用getdate() 函数来获取exec proc 的当前时间。抱歉英语不好,这不是我的母语。

标签: sql sql-server tsql stored-procedures sql-server-2012


【解决方案1】:

exec 语句中的@date 与存储过程中的不同。

你应该这样做:

DECLARE @date AS DATETIME
SET @date = GETDATE()
EXEC prInsertPrice 'N01', 20000, @date, null

【讨论】:

  • 还是不明白,能不能一步步指导我,我真是菜鸟
  • 他确实一步步指导你。事实上,它为您提供了使其工作所需的所有代码。哪一部分不清楚?
【解决方案2】:

当你运行时:

EXEC prInsertPrice 'N01', 20000, @date, null

您将变量@date 作为第三个参数传递给存储过程,即@Start_Date。这与您在存储过程本身内部 声明的@date 变量完全分开,该变量在执行过程被调用后 被声明和初始化。

如果您在调用存储过程之前没有初始化作为参数传递给存储过程的@date 变量,那么您将得到您所描述的错误。

所以,你需要先声明并初始化这个变量:

DECLARE @date DATETIME = '2017-01-01' -- You can whatever date value you require here
EXEC prInsertPrice 'N01', 20000, @date, null

这应该可以防止错误。

注意:如果您愿意,也可以将@date 变量的声明和初始化分开:

DECLARE @date DATETIME
SET @date = '2017-01-01'

在解决您的潜在问题或防止将不良数据插入您的NuggetPrice 表中时,我同意Prdp 的建议,即在表中添加CHECK 约束,例如:

ALTER TABLE NuggetPrice
  ADD CONSTRAINT CK_NuggetPrice CHECK (NuggetID LIKE 'N[0-9][0-9]' 
                                       AND Unit_Price IS NOT NULL 
                                       AND Start_Date IS NOT NULL) 

这也将防止任何人插入不符合指定逻辑的记录。

【讨论】:

    【解决方案3】:

    其他两个答案已经就错误原因提供了足够的信息,所以我不打算谈论它。这是解决数据验证的不同方法

    我建议您创建一个Check constraint 来执行此操作,而不是创建一个Stored Procedure 来限制将不良数据插入到表中

    ALTER TABLE NuggetPrice
      ADD CONSTRAINT CK_NuggetPrice CHECK (NuggetID LIKE 'N[0-9][0-9]' AND Unit_Price IS NOT NULL AND Start_Date IS NOT NULL) 
    

    这将确保没有人在NuggetPrice 中插入错误数据

    【讨论】:

    • 虽然我同意这可能是解决数据验证潜在问题的更好解决方案,但这个答案并不能帮助 OP 理解 为什么 他在他的问题。
    • @3N1GM4 那是因为你们已经回答了错误的原因
    • 很公平,我明白。你会反对我在我的回答中加入你的建议以改进它吗?同样,如果您愿意,请随时接受我的答案并将其应用于您的答案。
    • @3N1GM4 - 一点也不......请改进你的答案
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 2014-05-28
    • 2019-09-27
    • 2015-01-08
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多