SQLserver中的declare變量用法
SQL中的declare用法
平時(shí)寫(xiě)SQL查詢、存儲(chǔ)過(guò)程都是憑著感覺(jué)來(lái),沒(méi)有探究過(guò)SQL的具體語(yǔ)法,一直都是按c#那一套往SQL上模仿,前幾天項(xiàng)目中碰到一個(gè)問(wèn)題引起了我對(duì)declare定義變量的作用域的興趣。
大家都知道c#中的局部變量,在if中如果我們定義一個(gè)變量的話他的作用到if結(jié)束為止,if外是不識(shí)別這個(gè)變量的,else里都不能使用,簡(jiǎn)單的寫(xiě)一下。
if(true)
{
Int32i=1;
Console.WriteLine(i);
}
這個(gè)i的作用域就是if里面,如果我們?cè)趇f外面用這個(gè)變量
if(true)
{
Int32i=1;
Console.WriteLine(i);
}
Console.WriteLine(i);
那第二條輸出語(yǔ)句會(huì)報(bào)錯(cuò)
The name 'i' does not exist in the current context
說(shuō)明已經(jīng)出了i的作用域了。
那么我們要是在sql寫(xiě)這么一段代碼會(huì)是什么情況呢?首先寫(xiě)在if內(nèi)
IF1=1 BEGIN DECLARE@testVARCHAR SET@test='1' PRINT'inif:'+@test END
運(yùn)行看結(jié)果輸出in if:1這是可以預(yù)想的結(jié)果。那我們?cè)趇f外面使用變量@test試試。
IF1=1 BEGIN DECLARE@testVARCHAR SET@test='1' PRINT'inif:'+@test END PRINT'outif:'+@test
這樣會(huì)是什么結(jié)果呢,不知道大家怎么想的,以我的大腦順勢(shì)就想到這應(yīng)該報(bào)錯(cuò)啊,出了變量的作用域了。實(shí)際結(jié)果不僅沒(méi)報(bào)錯(cuò)而且@test的值還在。
in if:1
out if:1
看見(jiàn)這個(gè)結(jié)果當(dāng)時(shí)我很郁悶,SQL太出人意料了。
在SQL SERVER 2005的幫助文檔里關(guān)于declare的幫助里發(fā)現(xiàn)這么一句話,備注的第三行“局部變量的作用域是其被聲明時(shí)所在批處理”
Msdn的地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx
這行字在這么一大篇中還真挺不引人矚目。
現(xiàn)在我們知道原來(lái)declare變量的作用域是所在的批處理,if阻斷不了它的作用域,那上面我們的代碼if內(nèi)外的代碼都在一個(gè)批處理中,所以@test都是可用的且if里面設(shè)置的值還在。
下面我改造一下代碼,SQL中是以GO語(yǔ)句來(lái)區(qū)分批處理的
IF1=1 BEGIN DECLARE@testVARCHAR SET@test='1' PRINT'inif:'+@test END GO PRINT'outif:'+@test
這下對(duì)了,檢查語(yǔ)法后SQL報(bào)錯(cuò)“必須聲明標(biāo)量變量"@test"”
注:GO就是用于一個(gè)sql語(yǔ)句的結(jié)束 比如說(shuō)一個(gè)批處理語(yǔ)句是這樣的 select *from ,b select *from a 在后一個(gè)select后面加上一個(gè)GO這樣可以一次執(zhí)行兩條sql 語(yǔ)句
到此這篇關(guān)于SQL server中的declare變量用法的文章就介紹到這了,更多相關(guān)SQL server中的declare變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(2)
SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(2)2010-02-02
Sql server 備份還原后出現(xiàn) 受限制用戶 問(wèn)題
怎么解決Sql Server 2005數(shù)據(jù)庫(kù)備份還原后出現(xiàn)“受限制用戶”,這是大家在數(shù)據(jù)庫(kù)備份還原后經(jīng)常遇到的問(wèn)題,我們今天就來(lái)探討下.2020-03-03
SQL2005的維護(hù)計(jì)劃無(wú)法刪除的解決方法
今天開(kāi)發(fā)中,發(fā)現(xiàn)維護(hù)計(jì)劃無(wú)法刪除刪除了,遂發(fā)現(xiàn)下面的代碼,希望對(duì)碰到類似問(wèn)題的朋友有所幫助。2010-06-06
使用SQLSERVER 2005/2008 遞歸CTE查詢樹(shù)型結(jié)構(gòu)的方法
我們經(jīng)常遇到樹(shù)型結(jié)構(gòu),把它們顯示在一個(gè)類似TreeView控件上的情況。這時(shí)我們可以使用Recursive Common Table Expressions(CTE)實(shí)現(xiàn)2011-10-10
解析SQL2005中如何使用CLR函數(shù)獲取行號(hào)
本篇文章是對(duì)SQL2005中如何使用CLR函數(shù)獲取行號(hào)的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
sqlserver 2008手工修改表結(jié)構(gòu),表不能保存的問(wèn)題與解決方法
今天晚上休息,寫(xiě)一個(gè)小程序,用的是sql server 2008,手工建立了一些表,然后我回頭想到了表字段中有一些需要增加一列,回頭我就插入一列,結(jié)果我保存的時(shí)候卻彈出如下窗口2010-04-04
SQL2005學(xué)習(xí)筆記 APPLY 運(yùn)算符
APPLY 運(yùn)算符簡(jiǎn)介: APPLY 運(yùn)算符是Sql Server2005新增加的運(yùn)算符。2009-07-07
SQLServer2005 沒(méi)有日志文件(*.ldf) 只有數(shù)據(jù)文件(*.mdf) 恢復(fù)數(shù)據(jù)庫(kù)的方法
SQLServer2005 沒(méi)有日志文件(*.ldf) 只有數(shù)據(jù)文件(*.mdf) 恢復(fù)數(shù)據(jù)庫(kù)的方法2011-12-12

