摘 要:在SQL Server 2000數(shù)據(jù)庫中綜合運用Transact—SQL語言的CASE語句與函數(shù),可以方便靈活地解決多分支控制流程的問題。
關(guān)鍵詞:SQL Server 2000 Transact—SQL語言 CASE語句 函數(shù) 綜合運用
數(shù)據(jù)庫是計算機應用的一項重要技術(shù)。隨著計算機、網(wǎng)絡通信等技術(shù)的發(fā)展,在網(wǎng)絡多用戶環(huán)境下對數(shù)據(jù)進行安全有效的管理已成為計算機的一項重要應用。SQL Server 2000是微軟公司推出的基于SQL標準的關(guān)系型大型數(shù)據(jù)庫管理系統(tǒng)。
它功能強大,易學易用,與Windows 2000相結(jié)合,可以構(gòu)造網(wǎng)絡環(huán)境數(shù)據(jù)庫甚至分布式數(shù)據(jù)庫,可以滿足企業(yè)及Internet等大型數(shù)據(jù)庫的應用,當前使用十分普遍。
SQL Server 2000系統(tǒng)所使用的SQL語言稱為Transact—SQL。Transact—SQL是用于管理SQL Server 2000實例,創(chuàng)建和管理SQL Server 2000實例中的所有對象,并且插入、檢索、修改和刪除SQL Server 2000數(shù)據(jù)表中數(shù)據(jù)的命令語言,它是SQL Server 2000數(shù)據(jù)庫管理系統(tǒng)的核心。
使用Transact—SQL腳本可以編寫存儲過程,完成建立和操作數(shù)據(jù)庫、數(shù)據(jù)查詢、數(shù)據(jù)管理等工作。Transact—SQL語言可以在SQL Server 2000提供的查詢分析器上執(zhí)行,查詢分析器是一個具有執(zhí)行SQL腳本、分析查詢性能和調(diào)試存儲過程等功能的管理工具。它是SQL Server 2000系統(tǒng)中最常用的操作管理工具,利用它可以輸入、調(diào)試、運行SQL語句。
使用Transact—SQL的變量、運算符、函數(shù)和流程控制語句等基本語言元素,可以進一步豐富查詢操作,實現(xiàn)數(shù)據(jù)庫應用系統(tǒng)的復雜功能。
Transact—SQL語言中的CASE語句可以根據(jù)多個選擇決定程序執(zhí)行的流程。相當于if-else語句的嵌套,但結(jié)構(gòu)更清楚。
簡單CASE語句
·語法格式
CASE輸入表達式
WHEN比較表達式THEN結(jié)果表達式[...n]
?。跡LSE最終結(jié)果表達式]
END
·功能將輸入表達式的值與每一個比較表達式比較,若相等,則返回對應結(jié)果表達式的值;否則返回最終結(jié)果表達式的值。最終結(jié)果表達式也可以省略。輸入表達式和每個比較表達式的數(shù)據(jù)類型必須相同,或者可以隱式轉(zhuǎn)換。
?。?..n]表示可以使用多個“WHEN ... THEN”表達式子句。
例如:使用CASE語句根據(jù)輸入的學生分數(shù),輸出對應的等級,這個問題如果用C語言的switch語句很好完成,C語言程序如下:
main()
?。鹖nt score
printf("Please enter a score:");
scanf("%d",&score);
printf("score=%d:",score)
switch(score/10)
{case 10:
case 9:printf("A/n");break;/*分數(shù)在90分以上,則輸出A*/
case 8:printf("B/n");break;
case 7:printf("C/n");break;
case 6:printf("D/n");break;
default:printf("E/n");break;
}
}
若用Transact—SQL語言的CASE語句來做則會遇到一些問題,Transact—SQL語言大多數(shù)情況下是對表中數(shù)據(jù)進行操作,本例題中所使用的分數(shù)就來自于choice表,如按照C語言模式寫成如下程序:
use teachdb
select sno,score=
case score/10
when 9 thenprint"優(yōu)"
when 8 thenprint"良"
when 7 thenprint"中"
when 6 thenprint"及"
elseprint"不及格"
end
from choice go
則產(chǎn)生錯誤,因為sno是表中字段,它的運行結(jié)果會在“網(wǎng)格”標簽內(nèi)顯示,而print命令是在查詢分析器窗口的“消息”標簽中顯示用戶信息。且該例中的print語句屬于結(jié)果表達式,print語句的結(jié)果應賦值給score字段,而它們的類型又不匹配,所以這么設計在語法結(jié)構(gòu)上就存在缺陷。第一次修改程序時,取消print語句改為score,以驗證問題是否是因為類型不匹配造成的。修改后程序能正常運行說明語法上沒有問題,但所有score字段的結(jié)果都顯示為“NULL”,與預想的結(jié)果不符(預想的結(jié)果應為該生對應的分數(shù)),初步分析是輸入表達式score/10與比較表達式9,……,6都不匹配。
進入企業(yè)管理器查看choice表中score字段的類型為數(shù)值型,且學生具體分數(shù)值有小數(shù)部分,于是考慮將score小數(shù)部分去掉,ceiling()函數(shù)的功能是:返回大于或等于給定值的最小整數(shù)。將score/10改為ceiling(score)/10,再運行程序,所有score字段的結(jié)果仍為“NULL”,單獨執(zhí)行print ceiling(82.5)/10觀察其結(jié)果為:8.0,說明雖然去掉了小數(shù)部分,但其值仍為數(shù)值型,而比較表達式的值為整型所以不匹配,cast()函數(shù)的功能為:把一種數(shù)據(jù)類型強制轉(zhuǎn)換為另一種數(shù)據(jù)類型,再將ceiling(score)/10改為cast(ceiling(score)/10 as int),運行程序,所有score字段的結(jié)果為該生對應的分數(shù),結(jié)果正確。
接下來考慮如何讓學號后面出現(xiàn)的不是對應分數(shù)而是對應等級,前面已經(jīng)分析score字段與print語句的類型不匹配,所以將表中已有的score字段換成新加入的grade字段,即程序運行后新生成一個結(jié)果字段,程序如下:
use teachdb
select sno,grade--grade并不是表中已有的列
case cast(CEILING(score)/10as int)
when 9 then"優(yōu)"--分數(shù)在90分以上,則輸出“優(yōu)”
when 8 then"良"
when 7 then"中"
when 6 then"及"
else"不及格"
end
from choice go
實驗證明通過CASE語句與函數(shù)的綜合運用,可以方便靈活地解決多分支控制流程的問題。
參考文獻:
?。?]譚浩強.《C程序設計》.清華出版社,1991.
?。?]周力. 《SQL Server 2000實用教程》.大連理工大學出版社,2009.
?。?]田淑清,周海燕,趙重敏等.《全國計算機等級考試二級教程——C語言程序設計》.高等教育出版社,1998.