Sql 必须使用SELECT语句声明标量变量

Sql 必须使用SELECT语句声明标量变量,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有以下声明: 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ösin

我有以下声明:

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]从W_Karton中选择@Nr_Karton=ISNULL(最大(Nr),1000)

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


如何消除错误?

我做了一些尝试。我创建的虚构模式是:

创建表W_Karton(容器ID int、Nr int、Beschrieb varchar(1), CreationDate日期时间,位置varchar(10))

虽然它在我本地的2008R2框中解析并运行良好,但当粘贴到中时,相同的代码不起作用

但是,如果按照此移除除最后一个分号之外的所有分号,您可以看到它似乎工作正常


我相信这不会有什么区别,但如果你希望它能起作用,而不在乎为什么,试试看……

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

我觉得您的代码很好。发生在哪一行?作为旁注,请不要重新发明标识栏@我编辑的桥显示完全错误。重新设置标识列是什么意思?您发布的代码在SSMS 2008中解析时没有错误,这真的是导致错误的代码吗?你是如何执行的?您是否试图逐行执行它,而不是作为单个批处理?正如Bridge所说,您应该使用,而不是自己生成ID值。@PandyLegend当您插入新行时,具有标识规范的列将自动增加其值-这似乎是您试图模拟的,方法是获取当前的最高值,添加一个,然后将其添加回表中。太糟糕了,如果你有并发会话/多个用户等,它将不起作用,因为你可能会遇到冲突。我相信它在MySQL中被称为
AUTO_INCREMENT
。@brian,这就是为什么他有
ISNULL(MAX(Nr),1000)
。但错误是变量未定义,这很奇怪。捕捉得很好。不知道OP是否使用了SQL FIDLE。我猜它可能会把它分成几批。这里也是一样——无法重现问题,在2008 R2和2012上都可以正常工作。@MartinSmith是的,有点奇怪。看不到任何更具体的东西-也许SQL Fiddle在幕后将分号替换为
GO
?这很有效。当我去掉分号时,一切都很好。代码是从PHP脚本运行的,我在Navicat中进行了测试——两者都产生了相同的错误。代码递增“Nr”字段的原因是标识已经在ID字段中。这需要分开,并且并不总是与Nr字段相关。如果它类似于MySQL,那么如果您从表中删除最后几行,那么增量值将保持为比(新的、删除后的)最后一条记录多5行。使用这种方法将确保Nr字段中的数字始终是连续的。可能有更好的方法来做到这一点,但我并没有首先编写它,我仍然在思考系统应该如何工作。再加上我对MSSQL缺乏经验,这使得这份工作更加有趣!谢谢你的帮助。