SQL Server 存儲過程
SQL Server 中視圖通過簡單的 SELECT 查詢來解決復雜的查詢,但是視圖不能提供業務邏輯功能,而存儲過程可以辦到這點。
什么是存儲過程?
存儲過程 Procedure 是一組為了完成特定功能的 SQL 語句集合,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名稱并給出參數來執行。
存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
由于存儲過程在創建時即在數據庫服務器上進行了編譯并存儲在數據庫中,所以存儲過程運行要比單個的 SQL 語句塊要快。同時由于在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網絡流量、簡單網絡負擔。
存儲過程的優點
下面是一些在使用存儲過程的主要優點:
好處 | 說明 |
---|---|
模塊化編程 | 可以寫一個存儲過程一次,然后一次又一次地調用它,從應用程序的不同部分(甚至多個應用程序)。 |
性能 | 存儲過程提供更快的代碼執行和減少網絡流量。
|
安全 | 用戶無需執行任何直接的語句可以執行存儲過程。因此,存儲過程可以誰也不能正常訪問這些任務的用戶提供先進的數據庫功能,但這種功能是在嚴格控制的方式提供。 |
SQL Server 創建一個存儲過程
我們需要使用 CREATE PROCEDURE 語句創建一個存儲過程,接著要補充存儲過程的代碼,如果存儲過程將要接受參數,它們需要被包括在名稱后,如下:
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @{Parameter Name} {data type} AS ...
詳細示例
下述代碼創建了一個被稱為 “LatestTasks” 的存儲過程。
它接受一個參數名為 @Count. 當調用這個存儲過程,通過 @count 參數,它決定你想要多少行返回。
代碼如下:
CREATE PROCEDURE LatestTasks @Count int AS SET ROWCOUNT @Count SELECT TaskName AS LatestTasks, DateCreated FROM Tasks ORDER BY DateCreated DESC
在SQL Server管理套件運行這段代碼,會看到它被在存儲過程節點創建為 “LatestTasks”。
在SQL Server 2014,可以在存儲過程節點/文件夾中創建通過右鍵單擊一個存儲過程,選擇存儲過程....這將打開一個模板,這是隨時可以填入自己的具體程序。
SQL Server 執行存儲過程
創建了存儲過程后,要在任何時候執行它,可以執行或者調用 EXEC。如果存儲過程的參數要求提供這些程序名在后面,像這樣:
EXECUTE LatestTasks EXEC LatestTasks EXEC LatestTasks @Count = 5
詳細示例
在下面的例子中,我們在同一時間執行兩次存儲過程。
我們第一次調用它的時候 @Count 傳遞值為 3,第二次傳遞的值為 5。
該截圖顯示,通過傳遞參數(和值),存儲過程返回結果的基礎上提供值。頂端結果集返回3行,因為我們通過值3。第二個結果集返回5行,因為我們提供一個值5:
SQL Server 使用GUI
還可以使用圖形用戶界面來執行存儲過程。
具體方法如下:
SQL Server 修改存儲過程
如果需要修改現有的存儲過程,只需更換掉 CREATE ,使用 ALTER。
我們在 “Latest” 和 “Tasks”間添加一個空格(即“Latest Tasks”),并添加描述字段,如下:
ALTER PROCEDURE LatestTasks @Count int AS SET ROWCOUNT @Count SELECT TaskName AS "Latest Tasks", Description, DateCreated FROM Tasks ORDER BY DateCreated DESC
SQL Server 系統存儲過程
SQL Server 包含了大量的系統存儲過程,以幫助數據庫管理任務。
通過 GUI 執行的任務可以通過系統存儲過程來完成。
例如,有些東西可以用系統存儲過程的包括:
SQL Server 命名約定
一起來看看擴展系統存儲過程節點,我們發現,他們的名字都以 sp 開始,這樣的命名表明它是一個存儲過程。
該系統存儲過程顯然遵循的命名約定,在存儲過程制定一個一致的命名約定是好的,但是每個人的命名習慣都有不同。
有些人前綴的存儲過程 usp,另外其他人使用 SQL 關鍵字,如 SELECT,INSERT,UPDATE,DELETE;也有人使用的縮寫是一些下劃線(例如,latest_tasks)。
因此,我們的存儲過程可以被命名為以下任意一種,這取決于命名約定的使用。
- LatestTasks
- latest_tasks
- uspLatestTasks
- usp_latest_tasks
- selectLatestTasks
- select_LatestTasks
- select_latest_tasks
- getLatestTasks
- get_latest_tasks
不管選擇哪一種,都要保持一致性,這樣才會在需要使用存儲過程時顯得更加容易使用。
所以這是存儲過程覆蓋。在下一節中,我們將會了解用戶登錄。