这是我的SQL代码 -必须声明标量变量“@maxprice”
declare @maxprice int --1
set @maxprice = 1000 --2
select @maxprice --3
我1,2和1,2,3没有错误执行这些的组合。但是,当我先执行1,2和3后,我得到我提到的错误。
我无法理解为什么会发生这种情况。 select @maxprice不应该与常规select语句相似吗?
这是我的SQL代码 -必须声明标量变量“@maxprice”
declare @maxprice int --1
set @maxprice = 1000 --2
select @maxprice --3
我1,2和1,2,3没有错误执行这些的组合。但是,当我先执行1,2和3后,我得到我提到的错误。
我无法理解为什么会发生这种情况。 select @maxprice不应该与常规select语句相似吗?
像这样的SQL语句以块的形式执行,命令和定义仅在块内有效。一旦块完成,任何声明的变量超出范围,并且是未定义的。
所以,当你只执行第3行时,SQL服务器不知道或检查你以前是否用同一个变量做过某些事情,并自然抱怨变量没有被定义。
如果情况并非如此,有一次声明的变量仍范围(例如用于会话的持续时间),该系统将不得不采取非常谨慎,以解决之间的冲突,例如,@maxprice
在一个int
正在申报一个程序,并在另一个程序中输入money
。
有关SQL Server中变量和作用域规则的更详细讨论,请参见here。
这是你的意思 - 用int声明和选择,然后用钱重复?如果是这种情况,那么如果声明的变量保持在范围内,则不应该存在问题。重申它会/可能会杀死旧的范围。 –
我不是说它不能完成:)我说它没有像SQL Server那样完成,我想为什么这样做的原因是,对于没有用的功能有太多可能的副作用。 – SWeko
我看到声明变量的代码。我如何知道范围的结束?另外,是否有办法让一个“永久”变量,即其范围是永远的? –
当执行完成时,它会刷新你声明的所有变量,并且当只执行第3条语句时,它不会找到任何'@ maxprice'声明.. –
@AdeelAhmed - 我是一名初学者。我现在不知道所有这些事情。我在哪里可以学到它们? –