摘要 介紹了SQL Server中的存儲過程的基本概念,如何在Visual Studio.Net集成開發(fā)環(huán)境中使用存儲過程來提高應(yīng)用程序的執(zhí)行效率,并闡述了怎樣優(yōu)化存儲過程從而進一步提高訪問數(shù)據(jù)的效率,以及存儲過程與數(shù)據(jù)安全之間的關(guān)系。
關(guān)鍵詞 存儲過程 C# 優(yōu)化 數(shù)據(jù)安全
1引言
當(dāng)應(yīng)用MS SQLServer 創(chuàng)建一個應(yīng)用程序時,Transaction-SQL 是一種主要的編程語言。若運用SQL語言來進行編程,有兩種方法。其一是,在本地存儲Transaction- SQL 程序,并創(chuàng)建應(yīng)用程序向SQL Server 發(fā)送命令來對結(jié)果進行處理。其二是,可以把部分用Transaction-SQL 編寫的程序作為存儲過程存儲在SQL Server 中,并創(chuàng)建應(yīng)用程序來調(diào)用存儲過程,返回結(jié)果,然后對數(shù)據(jù)結(jié)果進行處理。
本文介紹的是第二種方法,即使用存儲過程訪問數(shù)據(jù)庫。
2存儲過程簡介
2.1存儲過程概念、優(yōu)點
存儲過程(Stored Procedure)是一組完成特定功能的SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。存儲過程能夠通過接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者決定;能夠返回狀態(tài)值給調(diào)用者,指明調(diào)用是成功或是失;包括針對數(shù)據(jù)庫的操作語句,并且可以在一個存儲過程中調(diào)用另一存儲過程。
存儲過程具有以下優(yōu)點:
①存儲過程允許標準組件式編程
存儲過程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程。而且數(shù)據(jù)庫專業(yè)人員可隨時對存儲過程進行修改,但對應(yīng)用程序源代碼毫無影響(因為應(yīng)用程序源代碼只包含存儲過程的調(diào)用語句),從而極大地提高了程序的可移植性。
②存儲過程能夠?qū)崿F(xiàn)較快的執(zhí)行速度
如果某一操作包含大量的SQL 代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因為存儲過程是預(yù)編譯的,在首次運行一個存儲過程時,查詢優(yōu)化器對其進行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的執(zhí)行計劃。而批處理的SQL 語句在每次運行時都要進行編譯和優(yōu)化,因此速度相對要慢一些。
③存儲過程能夠減少網(wǎng)絡(luò)流量
對于同一個針對數(shù)據(jù)庫對象的操作(如查詢、修改),如果這一操作所涉及到的SQL 語句被組織成一個存儲過程,那么當(dāng)在客戶計算機上調(diào)用該存儲過程時,網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,否則將是多條SQL 語句,從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負載。
④存儲過程可被作為一種安全機制來充分利用
系統(tǒng)管理員通過對執(zhí)行某一存儲過程的權(quán)限進行限制,從而能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)訪問權(quán)限的限制,避免非授權(quán)用戶對數(shù)據(jù)的訪問,保證數(shù)據(jù)的安全。存儲過程隱藏了數(shù)據(jù)庫模式和編程細節(jié),當(dāng)使用客戶端SQL代碼查詢一個數(shù)據(jù)庫時,你需要了解所查詢的表和列的詳情,這會將數(shù)據(jù)庫的模式呈現(xiàn)在客戶連接和客戶面前,存儲過程則不允許客戶端了解細節(jié),客戶或連接掌握的唯一信息就是它們要調(diào)用的存儲過程名,從這個角度看存儲過程提供了一個數(shù)據(jù)安全層。
2.2存儲過程類型
SQLServer支持以下五種類型的存儲過程:
系統(tǒng)存儲過程:此類存儲過程內(nèi)置于SQL Server,不能對其任意修改,它們提供有關(guān)數(shù)據(jù)庫模式、對象名、約束、數(shù)據(jù)類型以及許可等等方面的信息。
局部存儲過程:此類存儲過程由數(shù)據(jù)庫管理員或SQL Server開發(fā)人員編寫,是本文討論的重點。
臨時存儲過程:此類存儲過程由數(shù)據(jù)庫管理員和SQL Server開發(fā)人員編寫,但是只存在于連接期間。
遠程存儲過程:此類存儲過程存在于遠程服務(wù)器中,并且可以被一個初始服務(wù)器引用,遠程存儲過程用于分布式應(yīng)用程序中。
擴展存儲過程:此類存儲過程在功能上類似于局部存儲過程,但它們可以引用SQlServer外部的函數(shù)。
2.3 SQLServer處理存儲過程
存儲過程的處理分為兩個階段。在第一階段,存儲過程創(chuàng)建后首先由SQL Server數(shù)據(jù)庫引擎解析,這以后會發(fā)生兩件事。其一,SQL Server將該過程的定義、名稱和代碼保存到數(shù)據(jù)庫中,同時,SQL Server還會把代碼交付給查詢優(yōu)化器,以確定代碼的最佳執(zhí)行規(guī)劃;其次,代碼被編譯并被置于過程緩存中,只有在客戶連接顯示調(diào)用重編譯時或執(zhí)行規(guī)劃不再存在于高速緩存中時,高速緩存中的執(zhí)行規(guī)劃才被刷新。如圖1所示。
圖1 SQLServer處理存儲過程階段一
在第二階段,當(dāng)代碼中引用了此存儲過程名時,查詢規(guī)劃被檢索,過程代碼此時在調(diào)用它的每個連接的上下文中執(zhí)行,任何結(jié)果集或返回值都會返回給每一個連接。如圖2所示。
2.4 存儲過程中的錯誤處理
在存儲過程執(zhí)行過程中,如果遇到錯誤,SQLServer會返回錯誤代碼和錯誤信息。SQL Server 有近3800個預(yù)定義錯誤代碼,存儲在master數(shù)據(jù)庫的sysmessages表中。每一個錯誤代碼都有相應(yīng)的精確的級別。錯誤定義的級別從0到25。20以上的錯誤代表重大錯誤,意味著該錯誤會導(dǎo)致存儲進程立刻終止,并且所有的連接都要重新初始化。非關(guān)鍵性錯誤只是禁止當(dāng)前運行的有錯誤的代碼,并繼續(xù)執(zhí)行剩余的代碼。所有的錯誤代碼都有預(yù)定義的錯誤信息?梢愿鶕(jù)錯誤代碼獲得錯誤信息,然后返回給存儲過程的調(diào)用程序,利于程序編寫者處理錯誤。
3 在VS.net中調(diào)用存儲過程







