SQL中的declare用法、作用域
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
平時寫SQL查詢、存儲過程都是憑著感覺來,沒有探究過SQL的具體語法,一直都是按c#那一套往SQL上模仿,前幾天項(xiàng)目中碰到一個問題引起了我對declare定義變量的作用域的興趣。 大家都知道c#中的局部變量,在if中如果我們定義一個變量的話他的作用到if結(jié)束為止,if外是不識別這個變量的,else里都不能使用,簡單的寫一下。 if (true) { Int32 i = 1; Console.WriteLine(i); } 這個i的作用域就是if里面,如果我們在if外面用這個變量 if (true) { Int32 i = 1; Console.WriteLine(i); } Console.WriteLine(i); 那第二條輸出語句會報(bào)錯 The name 'i' does not exist in the current context 說明已經(jīng)出了i的作用域了。 那么我們要是在sql寫這么一段代碼會是什么情況呢?首先寫在if內(nèi) IF 1=1 BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END 運(yùn)行看結(jié)果輸出in if:1這是可以預(yù)想的結(jié)果。那我們在if外面使用變量@test試試。 IF 1=1
BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END PRINT 'out if:'+@test 這樣會是什么結(jié)果呢,不知道大家怎么想的,以我的大腦順勢就想到這應(yīng)該報(bào)錯啊,出了變量的作用域了。實(shí)際結(jié)果不僅沒報(bào)錯而且@test的值還在。 in if:1 out if:1 看見這個結(jié)果當(dāng)時我很郁悶,SQL太出人意料了。 在SQL SERVER 2005的幫助文檔里關(guān)于declare的幫助里發(fā)現(xiàn)這么一句話,備注的第三行“局部變量的作用域是其被聲明時所在批處理” Msdn的地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx 這行字在這么一大篇中還真挺不引人矚目。 現(xiàn)在我們知道原來declare變量的作用域是所在的批處理,if阻斷不了它的作用域,那上面我們的代碼if內(nèi)外的代碼都在一個批處理中,所以@test都是可用的且if里面設(shè)置的值還在。 下面我改造一下代碼,SQL中是以GO語句來區(qū)分批處理的 IF 1=1
BEGIN DECLARE @test VARCHAR SET @test='1' PRINT 'in if:'+@test END GO PRINT 'out if:'+@test 這下對了,檢查語法后SQL報(bào)錯“必須聲明標(biāo)量變量"@test"” 注:GO就是用于一個sql語句的結(jié)束 比如說一個批處理語句是這樣的 select *from ,b select *from a 在后一個select后面加上一個GO這樣可以一次執(zhí)行兩條sql 語句 轉(zhuǎn)自https://www.cnblogs.com/hushzhang/p/6699226.html 該文章在 2024/11/16 9:30:06 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |