2012-12-20 37 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

我看到聲明變量的代碼。我如何知道範圍的結束?另外,是否有辦法讓一個「永久」變量,即其範圍是永遠的? –