1. 程式人生 > >SQL中的declare用法

SQL中的declare用法

msdn 問題 備註 int32 技術 作用域 幫助 還在 sof

平時寫SQL查詢、存儲過程都是憑著感覺來,沒有探究過SQL的具體語法,一直都是按c#那一套往SQL上模仿,前幾天項目中碰到一個問題引起了我對declare定義變量的作用域的興趣。

大家都知道c#中的局部變量,在if中如果我們定義一個變量的話他的作用到if結束為止,if外是不識別這個變量的,else裏都不能使用,簡單的寫一下。

if (true)
{
Int32 i = 1;
Console.WriteLine(i);
}

這個i的作用域就是if裏面,如果我們在if外面用這個變量

if (true)
{
Int32 i = 1;
Console.WriteLine(i);
}
Console.WriteLine(i);

那第二條輸出語句會報錯

The name ‘i‘ does not exist in the current context

說明已經出了i的作用域了。

那麽我們要是在sql寫這麽一段代碼會是什麽情況呢?首先寫在if內

IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test=‘1‘
PRINT ‘in if:‘+@test
END

  運行看結果輸出in if:1這是可以預想的結果。那我們在if外面使用變量@test試試。

  

技術分享圖片 技術分享圖片 IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test=‘1‘
PRINT ‘in if:‘+@test
END
PRINT ‘out if:‘+@test

技術分享圖片 技術分享圖片

這樣會是什麽結果呢,不知道大家怎麽想的,以我的大腦順勢就想到這應該報錯啊,出了變量的作用域了。實際結果不僅沒報錯而且@test的值還在。

in if:1

out if:1

看見這個結果當時我很郁悶,SQL太出人意料了。

在SQL SERVER 2005的幫助文檔裏關於declare的幫助裏發現這麽一句話,備註的第三行“局部變量的作用域是其被聲明時所在批處理”

Msdn的地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx

這行字在這麽一大篇中還真挺不引人矚目。

現在我們知道原來declare變量的作用域是所在的批處理,if阻斷不了它的作用域,那上面我們的代碼if內外的代碼都在一個批處理中,所以@test都是可用的且if裏面設置的值還在。

下面我改造一下代碼,SQL中是以GO語句來區分批處理的

技術分享圖片 技術分享圖片 IF 1=1
BEGIN
DECLARE @test VARCHAR
SET @test=‘1‘
PRINT ‘in if:‘+@test
END
GO
PRINT ‘out if:‘+@test

技術分享圖片 技術分享圖片

這下對了,檢查語法後SQL報錯“必須聲明標量變量"@test"”

SQL中的declare用法