【问题标题】:Must declare the scalar variable with SELECT statement必须使用 SELECT 语句声明标量变量
【发布时间】:2015-09-23 22:25:20
【问题描述】:

我有如下声明:

DECLARE @Nr_Karton int;

SELECT @Nr_Karton = ISNULL(MAX(Nr), 1000)  FROM W_Karton;

SET @Nr_Karton = @Nr_Karton + 1;

INSERT INTO W_Karton (Container_ID, Nr, Beschrieb, CreationDate, Location) 
  VALUES ('1', @Nr_Karton, '', getDate(), 'Bösingen');

但我得到了错误:

[SQL] SELECT @Nr_Karton = ISNULL(MAX(Nr), 1000) FROM W_Karton

[Err] 42000 - [SQL Server]必须声明标量变量“@Nr_Karton”。

如何摆脱错误?

【问题讨论】:

  • 您的代码对我来说看起来不错。它发生在哪条线上?作为旁注,请不要重新发明身份列!
  • @Bridge 我编辑显示完整错误。重新定义身份列是什么意思?
  • 您发布的代码在 SSMS 2008 中解析没有错误,这真的是给出错误的代码吗?你是如何执行它的?您是否正在尝试逐行执行而不是作为单个批次执行?正如 Bridge 所说,您应该使用 IDENTITY column 而不是自己生成 ID 值。
  • @PandyLegend 具有标识规范的列将在您插入新行时自动增加它的值 - 这似乎是您试图通过获取当前最高值、添加一个然后添加回到桌子上。太糟糕了,如果您有并发会话/多个用户等,它将无法工作,因为您可能会遇到冲突。我相信它在 MySQL 中被称为AUTO_INCREMENT
  • @brian,这就是他设置ISNULL(MAX(Nr), 1000) 的原因。但是错误提示未定义变量,这很奇怪。

标签: sql sql-server sql-server-2008


【解决方案1】:

我玩了这个。我创建的虚构架构是:

CREATE TABLE W_Karton (Container_ID int, Nr int, Beschrieb varchar(1), CreationDate datetime, Location varchar(10))

虽然它在我的本地 2008R2 机器上解析并运行良好,但相同的代码在粘贴到 SQL Fiddle 时不起作用。

但是,如果您按照 SQL Fiddle 删除除最后一个分号之外的所有分号,您会发现它似乎工作正常!

我相信它不应该有任何区别,但是如果您希望它起作用并且不关心为什么,请尝试一下...

【讨论】:

  • 不错的收获。想知道 OP 是否正在使用 SQL Fiddle。猜猜它可能会分成几批。
  • 这里相同 - 无法重现问题,在 2008 R2 和 2012 上都可以正常工作。
  • @MartinSmith 是的,有点奇怪。看不到更具体的内容 - 也许 SQL Fiddle 在幕后用 GO 替换了分号?
  • 这行得通。当我删除分号时,它很好。该代码是从 PHP 脚本运行的,我在 Navicat 中进行了测试——两​​者都产生了相同的错误。代码增加“Nr”字段的原因是因为身份已经在 ID 字段上。这需要分开,并不总是与 Nr 字段相关。如果它像 MySQL,如果您从表中删除最后几行,增量值将保持为比(新的,删除后的)最后一条记录多 5。使用这种方法可以确保 Nr 字段中的数字始终是连续的。
  • 可能有更好的方法来做到这一点,但我一开始并没有写它,我仍在思考系统应该如何工作。再加上我对 MSSQL 的缺乏经验,这让这项工作变得更加有趣!感谢您的帮助。
【解决方案2】:

我遇到了同样的问题。原来是因为';'被选为“查询终结者”。在 SQL Fiddle 中,这实际上意味着“批处理终止符”。右下角应该有一个下拉按钮,其中包含文本“[;]”。单击它并选择“关键字 [GO]”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多