2012-12-20 73 views
1

这是我的SQL代码 -必须声明标量变量“@maxprice”

declare @maxprice int --1 
set @maxprice = 1000 --2 
select @maxprice --3 

我1,2和1,2,3没有错误执行这些的组合。但是,当我先执行1,2和3后,我得到我提到的错误。

我无法理解为什么会发生这种情况。 select @maxprice不应该与常规select语句相似吗?

+0

当执行完成时,它会刷新你声明的所有变量,并且当只执行第3条语句时,它不会找到任何'@ maxprice'声明.. –

+0

@AdeelAhmed - 我是一名初学者。我现在不知道所有这些事情。我在哪里可以学到它们? –

回答

2

像这样的SQL语句以块的形式执行,命令和定义仅在块内有效。一旦块完成,任何声明的变量超出范围,并且是未定义的。

所以,当你只执行第3行时,SQL服务器不知道或检查你以前是否用同一个变量做过某些事情,并自然抱怨变量没有被定义。

如果情况并非如此,有一次声明的变量仍范围(例如用于会话的持续时间),该系统将不得不采取非常谨慎,以解决之间的冲突,例如,@maxprice在一个int正在申报一个程序,并在另一个程序中输入money

有关SQL Server中变量和作用域规则的更详细讨论,请参见here

+0

这是你的意思 - 用int声明和选择,然后用钱重复?如果是这种情况,那么如果声明的变量保持在范围内,则不应该存在问题。重申它会/可能会杀死旧的范围。 –

+0

我不是说它不能完成:)我说它没有像SQL Server那样完成,我想为什么这样做的原因是,对于没有用的功能有太多可能的副作用。 – SWeko

+0

我看到声明变量的代码。我如何知道范围的结束?另外,是否有办法让一个“永久”变量,即其范围是永远的? –