存儲過程是存儲在服務器端的一類數據庫對象,它實質上是一段用SQL語言編寫的程序,它在服務器端預先經過編譯,並確定出執行計劃,因此與同樣功能的批處理語句相比,它的執行速度較快。
基本語法:
Create Procedure[owner.]過程名
[@參數名 數據類型[=默認值][Output]]
[,@參數名 數據類型[=默認值][Output]]
[……]
AS
Begin
SQL語句(塊)
End
存儲過程是數據庫對象,和表、索引是一個級別的;是SQL語句和控制流語言的集合,存儲過程在首次運行時被編譯,並駐留在過程高速緩存的內存中,所以存儲過程的招待非常快。存儲過程可以帶參數,可以調用其他過程,返回狀態值,返回參數值,並且可以在遠程SQL Server執行。可以在遠程SQL Server執行對數據庫設計有特別重要的意義。SQL Server提供的存儲過程稱為系統過程。
存儲過程大大增強了SQL的能力、效率和靈活性,經過編譯的存儲過程極大地改善SQL語句和批處理的性能。
存儲過程有很多優點:
●存儲過程在第一次執行時編譯,並存儲在過程高速緩存的內存中。編譯時系統對其進行優化,以選擇最佳的路徑來訪問數據集中的數據,這種優化考慮了數據集的實際數據結構。因此存儲過程大大提高了系統的性能。
●存儲過程可以跨服務器運行。這一點是通過觸發器來實現的,當然,首先存儲過程要能登錄到該遠程服務器。
●應用程序也能執行存儲過程,從而實現服務器和客戶之間的協同作業。
●存儲過程減少了網絡的交通。這是因為存儲過程的文本存儲在數據庫裡,調用存儲過程時通過網絡的只是存儲過程的過程名。
●利用存儲過程可以提供一個附加的安全層。
如(該例子取自pubs2數據庫):
Create proc titleid_proc(@title_id varchar(80))
As
Begin
Select @title_id=lower(@title_id) ”%”
Select title,title_id,price
Form titles
Where lower(title_id) like @title_id
Return @@rowcount
End
注意例子中的黑體部分,這實際上是一條賦值語句。該存儲過程有返回值。
存儲過程可以變得非常復雜。我們認為,創建存儲過程還是要遵循“最簡單就是最好”的原則。建議在創建存儲過程時采用縮進風格,否則創建的存儲過程三天之後連自己都看不懂。
需要對存儲過程作些說明:
●Create procedure 語句不能和其他語句在同一個批命令裡。
●Create procedure 語句不能包括下列語句:
use
Create VIEw
Create default
Create rule
Create trigger
Create procedure
不能使用use語句好理解,存儲過程是針對數據庫的,不能在一個數據庫裡訪問另外的數據庫。如果在存儲過程裡訪問另外的數據庫,則數據庫表的參照完整性難於得到保障。
從另外幾條語句看,在存儲過程裡一般不能創建新的數據庫對象。但可以創建表和索引,以及和表相關聯的鍵,表是臨時表,在存儲過程結束後不能看見創建的臨時表;否則的話每運行一次存儲過程就創建一個表,結果可想而知。
存儲過程裡不能創建一個對象,刪除它;然後又在同一存儲過程裡用相同的名字創建新的對象。實際上,SQL Server在存儲過程運行時而不是在編譯時創建對象的。
●如果存儲過程調用另外的存儲過程,則第二個存儲過程可以調用在第一個存儲過程裡創建的對象。
●存儲過程包含的最多參數為255個,對存儲過程裡的局部和全局變量沒有限制。
最後討論一下系統存儲過程。系統存儲過程以sp_開頭,當然用戶創建的存儲過程也可以以sp_開頭;系統過程保存在sybsystemprocs數據庫裡。系統過程的使用有權限,如果打入系統過程名但沒有出現預期的結果,要麼是命令名錯,要麼是使用者沒有該過程的權限。一般可通過系統管理員或數據庫所有者對系統過程的execute授權。
系統過程繁多,大致有幾類:
a. 用戶標志和授權。這一類的過程主要由於:增加、刪除或報告在SQL Server上的登錄,增加、刪除或報告某數據庫的用戶、分組或別名等。這類過程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
b. 遠程過程的調用。這類過程用於:增加、刪除或報告能存取本SQL Server的遠程服務器;增加能從遠程服務器上存取本SQL Server的用戶名。這類過程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
c. 數據定義和數據庫對象。這類存儲過程用於:連接和定義規則和缺省值,增加、刪除或報告主碼、外碼和公共碼;增加、刪除或報告用戶定義的數據類型。這類存儲過程有:sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
d. 系統管理。這類存儲過程用於:增加、刪除或報告數據庫及轉儲設備;報告鎖;設置的數據庫選擇及用戶正進行的進程;修改及報告配置變量;監控SQL Server的活動。這類過程有:sp_addumpdevice,sp_dropdevice, sp_helpdevice等。