2012-12-14 70 views
2

标量变量,我有以下声明:必须声明与SELECT语句

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]Must declare the scalar variable "@Nr_Karton".

如何摆脱错误的?

+2

你的代码对我来说看起来很好。它会发生什么?作为一个便笺,请不要重新发明身份栏! – Bridge

+0

@Bridge我编辑显示完整的错误。关于重新使用身份专栏,你的意思是什么? –

+0

您发布的代码在SSMS 2008中解析没有错误,是否真的提供错误的代码?你如何执行它?你可能试图逐行执行而不是单批执行?正如Bridge所说,您应该使用['IDENTITY'专栏](http://msdn.microsoft.com/zh-cn/library/ms186775(v = sql.100).aspx),而不是自己生成ID值。 – Pondlife

回答

5

我做了一些玩这个。我创建虚构的模式是:

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

虽然它解析,并在我的本地2008R2箱运行得很好,当粘贴到SQL Fiddle相同的代码没有工作。

但是,如果你删除所有分号除了最后一个SQL Fiddle你可以看到它似乎工作正常!

我认为它不应该有任何区别,但如果你宁愿它的工作和不关心的原因,不妨一试...

+0

很好的捕获。不知道OP是否使用SQL小提琴。猜猜它可能会分解成批。 –

+0

同样在这里 - 不能再现问题,在2008 R2和2012上都能很好地工作。 –

+0

@MartinSmith是的,有点奇怪。看不到任何更具体的东西 - 也许SQL Fiddle在幕后用“GO”取代了分号? – Bridge

4

我遇到了同样的问题。事实证明,这是由于';'被选为“查询终结者”。在SQL小提琴中,这实际上意味着“批终止符”。在右下角应该有一个下拉按钮,其中有文字“[;]”。点击并选择“Keyword [GO]”。