資源描述:
《sql存儲(chǔ)過(guò)程入門(mén)教程》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、1.sql存儲(chǔ)過(guò)程概述在大型數(shù)據(jù)庫(kù)系統(tǒng)中,存儲(chǔ)過(guò)程和觸發(fā)器具有很重要的作用。無(wú)論是存儲(chǔ)過(guò)程還是觸發(fā)器,都是SQL語(yǔ)句和流程控制語(yǔ)句的集合。就本質(zhì)而言,觸發(fā)器也是一種存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程在運(yùn)算時(shí)生成執(zhí)行方式,所以,以后對(duì)其再運(yùn)行時(shí)其執(zhí)行速度很快。SQLServer2000不僅提供了用戶(hù)自定義存儲(chǔ)過(guò)程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲(chǔ)過(guò)程。1.1存儲(chǔ)過(guò)程的概念存儲(chǔ)過(guò)程(StoredProcedure)是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)。中用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。在SQLServe
2、r的系列版本中存儲(chǔ)過(guò)程分為兩類(lèi):系統(tǒng)提供的存儲(chǔ)過(guò)程和用戶(hù)自定義存儲(chǔ)過(guò)程。系統(tǒng)過(guò)程主要存儲(chǔ)在master數(shù)據(jù)庫(kù)中并以sp_為前綴,并且系統(tǒng)存儲(chǔ)過(guò)程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQLServer提供支持。通過(guò)系統(tǒng)存儲(chǔ)過(guò)程,MSSQLServer中的許多管理性或信息性的活動(dòng)(如了解數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)庫(kù)信息)都可以被順利有效地完成。盡管這些系統(tǒng)存儲(chǔ)過(guò)程被放在master數(shù)據(jù)庫(kù)中,但是仍可以在其它數(shù)據(jù)庫(kù)中對(duì)其進(jìn)行調(diào)用,在調(diào)用時(shí)不必在存儲(chǔ)過(guò)程名前加上數(shù)據(jù)庫(kù)名。而且當(dāng)創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)時(shí),一些系統(tǒng)存儲(chǔ)過(guò)程會(huì)在新數(shù)據(jù)庫(kù)中被自動(dòng)創(chuàng)建。用戶(hù)自定義存儲(chǔ)過(guò)程是由用戶(hù)創(chuàng)
3、建并能完成某一特定功能(如查詢(xún)用戶(hù)所需數(shù)據(jù)信息)的存儲(chǔ)過(guò)程。在本章中所涉及到的存儲(chǔ)過(guò)程主要是指用戶(hù)自定義存儲(chǔ)過(guò)程。1.2存儲(chǔ)過(guò)程的優(yōu)點(diǎn)當(dāng)利用MSSQLServer創(chuàng)建一個(gè)應(yīng)用程序時(shí),Transaction-SQL是一種主要的編程語(yǔ)言。若運(yùn)用Transaction-SQL來(lái)進(jìn)行編程,有兩種方法。其一是,在本地存儲(chǔ)Transaction-SQL程序,并創(chuàng)建應(yīng)用程序向SQLServer發(fā)送命令來(lái)對(duì)結(jié)果進(jìn)行處理。其二是,可以把部分用Transaction-SQL編寫(xiě)的程序作為存儲(chǔ)過(guò)程存儲(chǔ)在SQLServer中,并創(chuàng)建應(yīng)用程序來(lái)調(diào)用存儲(chǔ)過(guò)程,對(duì)數(shù)據(jù)結(jié)果進(jìn)行處理存儲(chǔ)過(guò)程
4、能夠通過(guò)接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者確定;返回狀態(tài)值給調(diào)用者,指明調(diào)用是成功或是失??;包括針對(duì)數(shù)據(jù)庫(kù)的操作語(yǔ)句,并且可以在一個(gè)存儲(chǔ)過(guò)程中調(diào)用另一存儲(chǔ)過(guò)程。我們通常更偏愛(ài)于使用第二種方法,即在SQLServer中使用存儲(chǔ)過(guò)程而不是在客戶(hù)計(jì)算機(jī)上調(diào)用Transaction-SQL編寫(xiě)的一段程序,原因在于存儲(chǔ)過(guò)程具有以下優(yōu)點(diǎn):(1)存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件式編程存儲(chǔ)過(guò)程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫(xiě)該存儲(chǔ)過(guò)程的SQL語(yǔ)句。而且數(shù)據(jù)庫(kù)專(zhuān)業(yè)人員可隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼毫無(wú)影響(因?yàn)閼?yīng)用程序源代碼只包含存儲(chǔ)過(guò)程的調(diào)
5、用語(yǔ)句),從而極大地提高了程序的可移植性。(2)存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí),查詢(xún)優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語(yǔ)句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,因此速度相對(duì)要慢一些。(3)存儲(chǔ)過(guò)程能夠減少網(wǎng)絡(luò)流量對(duì)于同一個(gè)針對(duì)數(shù)據(jù)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢(xún)、修改),如果這一操作所涉及到的Transaction-SQL語(yǔ)句被組織成一存儲(chǔ)過(guò)程,
6、那么當(dāng)在客戶(hù)計(jì)算機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語(yǔ)句,否則將是多條SQL語(yǔ)句,從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負(fù)載。(4)存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用系統(tǒng)管理員通過(guò)對(duì)執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限進(jìn)行限制,從而能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)訪問(wèn)權(quán)限的限制,避免非授權(quán)用戶(hù)對(duì)數(shù)據(jù)的訪問(wèn),保證數(shù)據(jù)的安全。(我們將在14章“SQLServer的用戶(hù)和安全性管理”中對(duì)存儲(chǔ)過(guò)程的這一應(yīng)用作更為清晰的介紹)注意:存儲(chǔ)過(guò)程雖然既有參數(shù)又有返回值,但是它與函數(shù)不同。存儲(chǔ)過(guò)程的返回值只是指明執(zhí)行是否成功,并且它不能像函數(shù)那樣被直接調(diào)用,也就是在調(diào)用存儲(chǔ)過(guò)程時(shí),在存儲(chǔ)過(guò)程名字
7、前一定要有EXEC保留字。2.SQL存儲(chǔ)過(guò)程創(chuàng)建創(chuàng)建存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程是保存起來(lái)的可以接受和返回用戶(hù)提供的參數(shù)的Transact-SQL語(yǔ)句的集合??梢詣?chuàng)建一個(gè)過(guò)程供永久使用,或在一個(gè)會(huì)話(huà)中臨時(shí)使用(局部臨時(shí)過(guò)程),或在所有會(huì)話(huà)中臨時(shí)使用(全局臨時(shí)過(guò)程)。也可以創(chuàng)建在Microsoft?SQLServer?啟動(dòng)時(shí)自動(dòng)運(yùn)行的存儲(chǔ)過(guò)程。2.1語(yǔ)法CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPI
8、LE
9、ENCRYPTION
10、RECOMPILE,EN