目錄
一、存儲過程概念
1.概念
存儲過程是存放在數據庫服務器上的預先定義與編譯好的T-SQL語句集合,是一個獨立的數據庫對象。
2.特點
實現了模塊化編程。
存儲過程具有對數據庫立即訪問的功能。
使用存儲過程可以加快程序的運行速度。
使用存儲過程可以減少網絡流量。
使用存儲過程可以提高數據庫的安全性。
存儲過程由應用程序激活,而不是由系統自動執行
存儲過程可以接受輸入參數和返回值。
二、存儲過程的創建
存儲過程的定義主要包括兩部分:一是過程名及參數的說明;二是過程體的說明。創建存儲過程的語句一般形式如下:
CREATE procedure<存儲過程名>
[<參數列表>]
AS
<過程體>
說明:
⑴ 參數列表:由一個或多個參數說明組成,每個參數說明包括
參數名和參數的數據類型。當然,存儲過程可以
沒有任何參數。
參數格式爲: 參數名 數據類型 [=缺省值] [OUTPUT]
⑵ 過程體:是實現存儲過程功能的一組T-SQL語句,可以包含任意多的SQL語句。
①但sql語句中不能使用CREATE(VIEW、TRIGER、DEFAULT、RULE、PROCEDURE等)語句,
同時要慎重使用其他的CREATE、DROP等語句。
②爲了使存儲過程的設計更方便,功能更強大。可使用流程控制語句,主要有以下幾種:
· 賦值語句。可將SQL表達式的值賦值給局部變量。
· 分支語句。用於設計分支程序。如: IF語句、CASE語句等。
· 循環語句。如:WHILE等語句。
· 調用存儲過程語句CALL,或EXECUTE和從存儲過程返回語句RETURN。
③在存儲體中除了可以使用流程控制語句外,還可以使用遊標。
例1 創建一個不帶參數的存儲過程,完成查詢每位學生的選課情況及其成績。
use exp6; go CREATE procedure Proc1 AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,cj WHERE Student.Sno=cj.Sno AND Course.Cno=cj.Cno GO execute Proc1 --執行存儲過程
最後一句運行結果:
例2 創建一個帶參數的存儲過程,完成查詢指定課程的選修情況。
go CREATE PROCEDURE Proc2 @x CHAR(2) AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,Cj WHERE Student.Sno=Cj.Sno AND Course.Cno=Cj.Cno and Cj.Cno=@x ORDER by Cj.Sno GO -- 2號課程選修情況 execute Proc2 2
最後一句運行結果:
例3 創建一個帶參數並有返回值的存儲過程,完成輸出指定學號的學生的‘2’號課程的成績,並將結果,賦給一輸出參數。
go CREATE PROCEDURE Proc3 @x CHAR(10),@vgrade INT OUTPUT --輸出參數 AS SELECT @vgrade=Grade FROM cj WHERE Sno=@x AND Cno='2' RETURN --只有一個輸出參數 當然返回他了 go --執行 declare @v1 char(9),@v2 smallint select @v1='2000201' --賦值 --查詢學號爲@v1的2號課程的成績 並將結果賦給輸出參數@v2 exec Proc3 @v1,@v2 output --output不能省略 形參實參位置都要 print @v2 --運行結果: 40
執行存儲過程:EXEC[UTE] <存儲過程名> [ [過程參數變量=] {值| 變量 [OUTPUT] …} --exec和execute都行
三. 修改和刪除存儲過程
⑴修改存儲過程:
語句格式: ALTER PROC[EDURE] <存儲過程名> {同定義}
⑵刪除存儲過程:DROP PROCEDURE
語句格式: DROP PROC[EDURE] <存儲過程名>
eg:drop proc Proc3
四、存儲過程的種類
1.SQL Server提供的存儲過程
SQL Server提供了很多現成的、實用的存儲過程供用戶使用。
常用的存儲過程分爲5類:
系統存儲過程(sp_)
擴展存儲過程(xp_)
遠程存儲過程
局部存儲過程
臨時存儲過程
⑴系統存儲過程(sp_)
SQL Server系統存儲過程是爲管理員而提供的,
SQL Server安裝時在master數據庫中創建並由系統管理員擁有。
使用戶可以很容易地從系統表中取出信息,管理數據庫,並執行
涉及更新系統表的其他任務。系統存儲過程命令均以sp_打頭,
其作用進行數據庫管理。
SQL Server提供了許多系統存儲過程以方便檢索和操縱存放
在系統表中的信息,系統存儲過程可以在任意一個數據庫中執行。
例如,常用的系統存儲過程有:
sp_ helpdb(database_name): 返回指定數據庫信息
sp_help(object): 返回指定數據庫對象的信息
sp_addlogin: 建立SQL Server用戶帳號
sp_datatype_info: 返回由當前環境支持的數據類型的信息
sp_monitor: 按一定格式顯示的系統全局變量的當前值
⑵ 擴展存儲過程(xp_)
擴展存儲過程提供一種類似於存儲過程的方式,它們是動態裝入和執行的動態
連接庫(DLL)內的函數,無縫地擴展SQL Server功能。SQL Serve之外的動作可以
很容易地觸發,外部信息返回到SQL Server。另外,擴展存儲過程支持返回狀態碼和輸出。
注意:必須從master數據庫執行擴展存儲過程。
用戶可以創建自己的擴展存儲過程。
例如,下面是一些的擴展存儲過程:
xp_cmdshell: 作爲一個操作系統外殼執行指定命令串,並以文本形式返回任何輸出。
xp_logevent: 在SQL Server日誌文件或WindowsNT事件查看器中記錄用戶定義的信息。
xp_msver: 返回SQL Server版本信息及各種環境信息。
⑶ 遠程存儲過程
遠程存儲過程是從連接到不同服務器的遠程服務器或客戶機調用的存儲過程。
⑷ 局部存儲過程
局部存儲過程在各個用戶數據庫中創建。只能由創建它的用戶調用。
⑸ 臨時存儲過程
臨時存儲過程可是局部的,名字前的前綴是"#";也可是全局的,名字前的前綴是"##"。
臨時存儲過程存放在tempdb數據庫中。
局部臨時存儲過程在單個用戶會話中使用,該用戶退出時,自動被刪除。
全局臨時存儲過程所有用戶都可以使用,當最後一個用戶退出時,自動被刪除。