SQL Server-儲存過程
儲存過程是使用SQL Server所提供的Transact-SQI語言所編寫的程式。SQL Server不僅提供了使用者自定義的儲存過程的功能,而且也提供了許多可作為工具使用的系統儲存過程。本篇主要介紹使用者自定義儲存過程的建立、修改、刪除、執行的方法。
儲存過程的型別
SQL Server中的儲存過程劃分為4類:
- 系統儲存過程。
- 擴充套件儲存過程。
- 使用者自定義儲存過程。
- 臨時性儲存過程。
常用的儲存過程分為兩類:系統提供的儲存過程和使用者自定義儲存過程。系統提供的儲存過程是系統自動建立的,並以sp_為字首。在SQL Server中,許多管理活動和資訊活動都可以使用系統儲存過程來執行:使用者自定義儲存過程是由使用者建立並完成某一特定功能的儲存過程,儲存在所屬的資料庫中。
儲存過程的特點
使用SQL Server中的儲存過程而不使用儲存在客戶計算機本地的 T-SQL程式的原因主要是儲存過程具有以下特點:
(1)允許模組化程式設計
儲存過程只需建立一次便可作為資料庫中的物件之一儲存在資料庫中,以後各使用者即可在程式中呼叫該過程任意次。
(2)執行速度更快
儲存過程只在第一次執行時需要編譯且被儲存在儲存器內,其他次執行就可以不必由資料引擎逐一再翻譯,從而提高了執行速度。
(3)減少網路流量
一個需要數百行Transact-SQL程式碼的操作通過一條執行過程程式碼的單獨語句就可實現,而不需要在網路中傳送數百行程式碼。
(4)可作為安全機制使用
對於沒有直接執行儲存過程中某個(些)語句許可權的使用者,也可授予他們執行該儲存過程的許可權。
(5)減輕操作人員和程式設計者的勞動強度
使用者通過執行現有的儲存過程,並提供儲存過程所需的引數就可以得到所需要的結果而不用接觸SQL命令。
SQL Server 應用程式
在使用SQL Server 建立應用程式時,Transact-SQL程式語言是應用程式和SQL Server資料庫之間的主要程式設計介面。使用Transact-SQL程式時,可用兩種方法儲存和執行程式:
(1)在本地(客戶端)建立並存儲程式,把此程式傳送給SQL Server 執行。
(2)在SQL Server中建立儲存過程,並將其儲存在SQL Server中;然後SQL Server或客戶端呼叫執行此儲存過程。
儲存過程的功能
SQL Server中的儲存過程與其他程式語言中的過程類似:
(1)可以以輸人蔘數的形式引用儲存過程以外的引數。
(2)可以以輸出引數的形式將多個值返回給呼叫它的過程或批處理。
(3)儲存過程中包含有執行資料庫操作的程式設計語句,也可呼叫其他儲存過程。
(4)用RETURN向呼叫過程或批處理返回狀態值,以表明成功或失敗,以及失敗原因。
儲存過程的許可權
(1)執行Create Procedure語句者,必須是系統管理員、資料庫擁有者或資料定義語言管理員角色中的一個成員,或被授予Create Procedure許可權的人員。
(2)建立過程者一定擁有過程中所引用的所有物件的許可權:UPDATE、INSERT、DELETE、SELECT。
(3)若過程擁有者把執行此過程的許可權授予某使用者,那麼此使用者就擁有此過程的執行許可權。
建立並執行儲存過程
1.互動式建立並執行一儲存過程
開啟SQL Server Management Studio。在“物件資源管理器”中,按序展開“資料庫”→jxsk→“可程式設計性”→“儲存過程”節點,右擊“儲存過程”,在開啟的快捷選單中,選擇“新建儲存過程”命令。開啟儲存過程編輯視窗,幷包含模板語句。
將模板語句修改為如下所示的SQL語句:
set ansi_nulls on go set quoted_identifier on go create procedure Pro_Qsinf @sno_in char(8) = '02', @sname_out char(8) output, @sage_out int output, @dept_out char(10) output as begin set nocount on -- SET NOCOUNT { ON | OFF }:不返回計數(表示受 Transact-SQL 語句影響的行數)| 返回計數. select @sname_out = SN, @sage_out = AGE, @dept_out = DEPT from S where SNO = @sno_in end go
- 當 SET NOCOUNT 為 ON 時,將不給客戶端傳送儲存過程中的每個語句的 DONE_IN_PROC 資訊。當使用 Microsoft SQL Server 提供的實用工具執行查詢時,在 Transact-SQL 語句(如 SELECT、INSERT、 UPDATE 和 DELETE)結束時將不會在查詢結果中顯示"nn rows affected"。
- 如果儲存過程中包含的一些語句並不返回許多實際的資料,則該設定由於大量減少了網路流量,因此可顯著提高效能。
- SET NOCOUNT 設定是在執行或執行時設定,而不是在分析時設定。
我們應該在儲存過程的頭部加上SET NOCOUNT ON 這樣的話,在退出儲存過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化儲存過程的目的。
單擊工具欄中的“!”按鈕,儲存建立的儲存過程。
開啟查詢編輯器視窗。在查詢編輯器視窗中輸人下列SQL語句,查詢並顯示預設學號02和學號為04的學生的姓名和年齡。
declare @sno_in char(8), @sname_out char(8), @sage_out int, @sdept_out char(10) exec Pro_Qsinf default, @sname_out output, @sage_out output, @sdept_out output print @sname_out print @sage_out print @sdept_out go declare @sno_in char(8), @sname_out char(8), @sage_out int, @sdept_out char(10) select @sno_in = '04' exec Pro_Qsinf @sno_in, @sname_out output, @sage_out output, @sdept_out output print @sname_out print @sage_out print @sdept_out go
2.用T-SQL建立並執行一儲存過程。
2.1 查詢並顯示某位學生的某個課程的成績。
create procedure Pro_Qscore @sname_in char(8), @cname_in char(10), @score_out tinyint output as
select @score_out = SCORE from S, C, SC where S.SNO = SC.SNO and C.CNO = SC.CNO and SN = @sname_in and CN = @cname_in go
declare @sname_in char(8), @cname_in char(10), @score_out tinyint select @sname_in = '李思' select @cname_in = '程式設計' exec Pro_Qscore @sname_in, @cname_in, @score_out output print rtrim(@sname_in) + ' = ' + ltrim(str(@score_out)) go
2.2 利用學生姓名查詢該生選修的課程名、成績、以及任課教師姓名。
create procedure Pro_SCT @sname_in char(10), @cname_out char(10) output, @score_out int output, @tname_out char(10) output as select @cname_out = CN, @score_out = SCORE, @tname_out = TN from S, SC, C, TC, T where S.SNO = SC.SNO and C.CNO = SC.CNO and SC.CNO = TC.CNO and TC.TNO = T.TNO and SN = @sname_in
go
declare @sname_in char(10), @cname_out char(10), @score_out int, @tname_out char(10)
select @sname_in = '張三'
exec Pro_SCT @sname_in,@cname_out output,@score_out output, @tname_out output
print @cname_out
print @score_out
print @tname_out
go
2.3 利用課程名查詢選修該課程的學生姓名、系別、成績,並給出“程式設計”課程的該查詢資訊。
create procedure Pro_SC @cname_in char(10) as select SN, DEPT, SCORE from S, SC, C where S.SNO = SC.SNO and C.CNO = SC.CNO and CN = @cname_in
go
exec Pro_SC '程式設計'
go
2.4 利用教師姓名和課程名檢索該教師該任課的課程名、課時數、選課人數、平均成績、最高成績,並查詢教師“張雪”的“微機原理”課程的情況記錄。
create procedure Pro_TC @tname_in char(10), @cname_in char(10) as select CN, Chour, count(SNO) 選課人數, avg(SCORE) 平均分, max(SCORE) 最高分 from C, SC, T, TC where C.CNO = SC.CNO and C.CNO = TC.CNO and TC.TNO = T.TNO and TN = @tname_in group by CN, Chour having CN = @cname_in go exec Pro_TC '張雪', '程式設計' go
修改儲存過程
1.互動式修改儲存過程Pro_Qsinf。
開啟SQL Server Management Studio。在“物件資源管理器”中,展開“資料庫”→jxsk→“可程式設計性”→“儲存過程”節點,右擊儲存過程Pro_Qsinf,在彈出的快捷選單中選擇“修改”選項,開啟編輯視窗。
把輸人變數sno_in的長度改為2;把輸出變數sage_out的型別改為tinyint。
2.用ALTER PROCEDURE語句修改儲存過程Pro_Qsinf。
將儲存過程Pro_Qsinf的定義修改為根據學號查詢姓名﹑性別、系名。設定預設學號為01。
alter procedure Pro_Qsinf @sno_in char(2) = '01', @sname_out char(8) output, @ssex_out char(2) output, @dept_out char(10) output as select @sname_out = SN, @ssex_out = SEX, @dept_out = DEPT from S where SNO = @sno_in go
刪除儲存過程
1.互動式刪除儲存過程Pro_Qsinf。
啟動SQL Server Management Studio。在“物件資源管理器”中,展開“資料庫”→jxsk→“可程式設計性”→“儲存過程”節點,選擇儲存過程Pro_Qsinf。右擊儲存過程 Pro_Qsinf,在彈出的快捷選單中選擇“刪除”選項。彈出“刪除物件”對話方塊,單擊“確定”按鈕,儲存過程Pro_Qsinf即被刪除。
2.用DROP PROCEDURE語句刪除儲存過程 Pro_Qscore。
drop procedure Pro_Qscore go