在SQL Server中,存儲過程是比視圖更強大。視圖讓我們簡單地做一個SELECT查詢也在可視圖本身,它的工作方式是用于運行復雜的查詢。 但視圖并不姝真正為我們提供代碼業(yè)務邏輯的能力。例如,視圖不會能讓我們增加條件代碼(如IF語句)。幸運的是存儲過程可能使用。
存儲過程是一組SQL語句編譯成一個SQL。類似于在說的SQL腳本頁面,在這里可以運行許多SQL腳本合為一個整體。
然而,存儲過程并不僅僅是一個長腳本。這是已保存在SQL Server中明確在存儲過程節(jié)點的腳本。存儲過程通常包含一些業(yè)務邏輯。 例如,一個存儲過程可以接受被傳遞給它的并針對這些參數(shù)測試使用IF語句的參數(shù)。例如,如果該參數(shù)是一個值,這樣做,如果它是另一個值。
它們包含業(yè)務邏輯的能力使存儲過程SQL Server的強大的一部分。存儲過程可以提高性能的應用程序,因為存儲過程進行解析,并盡快,因為它是建立優(yōu)化,然后存儲在內(nèi)存中。運行通過存儲過程條件的查詢可以是非???- 相比,發(fā)送查詢通過網(wǎng)絡,到SQL Server的應用程序,遂將全部返還給它在網(wǎng)絡上,因此它可以過濾通過它,并挑選出只是它感興趣的記錄數(shù)據(jù)。
下面是一些在使用存儲過程的主要優(yōu)點:
| 好處 | 說明 |
|---|---|
| 模塊化編程 | 可以寫一個存儲過程一次,然后一次又一次地調(diào)用它,從應用程序的不同部分(甚至多個應用程序)。 |
| 性能 |
存儲過程提供更快的代碼執(zhí)行和減少網(wǎng)絡流量。
|
| 安全 | 用戶無需執(zhí)行任何直接的語句可以執(zhí)行存儲過程。因此,存儲過程可以誰也不能正常訪問這些任務的用戶提供先進的數(shù)據(jù)庫功能,但這種功能是在嚴格控制的方式提供。 |
要創(chuàng)建一個存儲過程,需要使用CREATE PROCEDURE語句,其次是彌補了存儲過程的代碼。如果存儲過程將要接受參數(shù),它們需要被包括在名稱后。
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @{Parameter Name} {data type} AS ...
下面的代碼創(chuàng)建一個存儲過程被稱為“LatestTasks”。它接受一個參數(shù)名為 @Count. 當調(diào)用這個存儲過程,通過@count參數(shù),它決定你想要多少行返回。下面的代碼:
CREATE PROCEDURE LatestTasks @Count int AS SET ROWCOUNT @Count SELECT TaskName AS LatestTasks, DateCreated FROM Tasks ORDER BY DateCreated DESC
運行這段代碼在SQL Server管理套件,會看到它被在存儲過程節(jié)點創(chuàng)建為“LatestTasks”。
在SQL Server2014,可以在存儲過程節(jié)點/文件夾中創(chuàng)建通過右鍵單擊一個存儲過程,選擇存儲過程....這將打開一個模板,這是隨時可以填入自己的具體程序。
現(xiàn)在,已經(jīng)創(chuàng)建了存儲過程,要執(zhí)行它的任何時間,需要使用調(diào)用它要么執(zhí)行或EXEC。如果存儲過程的參數(shù)要求提供這些程序名在后面。像這樣:
EXECUTE LatestTasks EXEC LatestTasks EXEC LatestTasks @Count = 5
在下面的例子中,我們在同一時間執(zhí)行存儲過程兩次。我們第一次調(diào)用它,我們通過@Count傳遞為3,第二次傳遞的值為5。
該截圖顯示,通過傳遞參數(shù)(和值),存儲過程返回結(jié)果的基礎上提供值。頂端結(jié)果集返回3行,因為我們通過值3。第二個結(jié)果集返回5行,因為我們提供一個值5:
還可以使用圖形用戶界面來執(zhí)行存儲過程。
具體方法如下:


如果需要修改現(xiàn)有的存儲過程,只需更換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包含了大量的系統(tǒng)存儲過程,以幫助數(shù)據(jù)庫管理任務??梢酝ㄟ^GUI執(zhí)行的任務可以通過系統(tǒng)存儲過程來完成。 例如,有些東西可以用系統(tǒng)存儲過程的包括:
擴展系統(tǒng)存儲過程節(jié)點,一起來看看。會發(fā)現(xiàn),他們的名字都開始以sp_,表明它是一個存儲過程。該系統(tǒng)存儲過程顯然遵循的命名約定。
這是一個好主意,制定一個一致的命名約定存儲過程(并為數(shù)據(jù)庫中的所有其他對象)。
有些人前綴的存儲過程usp_,另外其他人使用SQL關(guān)鍵字,如SELECT,INSERT,UPDATE,DELETE。其他人使用的縮寫應用。
一些使用下劃線的存儲過程(例如,latest_tasks)在單獨的單詞,而其他人將使用標題的情況下(例如,LatestTasks)。
因此,這是可能的,我們的存儲過程可以被命名為以下任意一種,這取決于命名約定的使用。
最重要的是一致性。選擇一個,并堅持下去。它會更容易,當你需要使用存儲過程。 想象一下,有幾十,甚至上百的存儲程序,每一次執(zhí)行一次,需要找到它在對象資源管理器,是否把它稱為usp_LatestTasks或uspLatestTasks。
所以這是存儲過程覆蓋。接下來,我們了解用戶登錄。