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


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