SQL Server存儲過程
在SQL Server中,存儲過程是比視圖更強大。視圖讓我們簡單地做一個SELECT查詢也在可視圖本身,它的工作方式是用於運行複雜的查詢。 但視圖並不姝真正為我們提供代碼業務邏輯的能力。例如,視圖不會能讓我們增加條件代碼(如IF語句)。幸運的是存儲過程可能使用。
什麼是存儲過程?
存儲過程是一組SQL語句編譯成一個SQL。類似於在說的SQL腳本頁麵,在這裡可以運行許多SQL腳本合為一個整體。
然而,存儲過程並不僅僅是一個長腳本。這是已保存在SQL Server中明確在存儲過程節點的腳本。存儲過程通常包含一些業務邏輯。 例如,一個存儲過程可以接受被傳遞給它的並針對這些參數測試使用IF語句的參數。例如,如果該參數是一個值,這樣做,如果它是另一個值。
它們包含業務邏輯的能力使存儲過程SQL Server的強大的一部分。存儲過程可以提高性能的應用程序,因為存儲過程進行解析,並儘快,因為它是建立優化,然後存儲在內存中。運行通過存儲過程條件的查詢可以是非常快 - 相比,發送查詢通過網絡,到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 Server2014,可以在存儲過程節點/文件夾中創建通過右鍵單擊一個存儲過程,選擇存儲過程....這將打開一個模板,這是隨時可以填入自己的具體程序。
執行存儲過程
現在,已經創建了存儲過程,要執行它的任何時間,需要使用調用它要麼執行或EXEC。如果存儲過程的參數要求提供這些程序名在後麵。像這樣:
EXECUTE LatestTasks EXEC LatestTasks EXEC LatestTasks @Count = 5
示例
在下麵的例子中,我們在同一時間執行存儲過程兩次。我們第一次調用它,我們通過@Count傳遞為3,第二次傳遞的值為5。
該截圖顯示,通過傳遞參數(和值),存儲過程返回結果的基礎上提供值。頂端結果集返回3行,因為我們通過值3。第二個結果集返回5行,因為我們提供一個值5:
使用GUI
還可以使用圖形用戶界麵來執行存儲過程。
具體方法如下:
- 使用對象資源管理器,瀏覽到存儲過程
-
右鍵單擊該存儲過程並選擇 Execute Stored Procedure...:
-
會出現一個對話框。輸入您所選擇的參數值:
- 點擊 OK
- SQL Server現在會生成SQL代碼並執行存儲過程。
修改存儲過程
如果需要修改現有的存儲過程,隻需更換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包含了大量的係統存儲過程,以幫助數據庫管理任務。可以通過GUI執行的任務可以通過係統存儲過程來完成。 例如,有些東西可以用係統存儲過程的包括:
- 配置安全帳戶
- 建立鏈接服務器
- 創建一個數據庫維護計劃
- 創建全文檢索目錄
- 添加遠程登錄
- 配置複製
- 設置調度作業
- 以及更多...
命名約定
擴展係統存儲過程節點,一起來看看。會發現,他們的名字都開始以sp_,表明它是一個存儲過程。該係統存儲過程顯然遵循的命名約定。
這是一個好主意,製定一個一致的命名約定存儲過程(並為數據庫中的所有其他對象)。
有些人前綴的存儲過程usp_,另外其他人使用SQL關鍵字,如SELECT,INSERT,UPDATE,DELETE。其他人使用的縮寫應用。
一些使用下劃線的存儲過程(例如,latest_tasks)在單獨的單詞,而其他人將使用標題的情況下(例如,LatestTasks)。
因此,這是可能的,我們的存儲過程可以被命名為以下任意一種,這取決於命名約定的使用。
- LatestTasks
- latest_tasks
- uspLatestTasks
- usp_latest_tasks
- selectLatestTasks
- select_LatestTasks
- select_latest_tasks
- getLatestTasks
- get_latest_tasks
最重要的是一致性。選擇一個,並堅持下去。它會更容易,當你需要使用存儲過程。 想象一下,有幾十,甚至上百的存儲程序,每一次執行一次,需要找到它在對象資源管理器,是否把它稱為usp_LatestTasks或uspLatestTasks。
所以這是存儲過程覆蓋。接下來,我們了解用戶登錄。