「預存程序」(Stored Procedure)就是將常用的或很複雜的工作,預先以SQL程式寫好,然後指定一個程序名稱儲存起來,那麼以後只要使用EXECUTE敘述來執行這個程序,即可自動完成該項工作。
預存程序的優點
預存程序中可以包含資料存取敘述、流程控制敘述、錯誤處理敘述...等在使用上非常有彈性。其優點有:
執行效率高:SQL Server會預先將預存程序編譯成一個執行計劃並儲存起來,因此每次執行預存程序時都不需要再重新編譯,如此可以加快執行速度。由此可知,我們應該將經常使用的一些操作寫成預存程序,來提高SQL Server的運作效率。
統一的操作流程:我們可以將複雜的工作製做成預存程序,如此除了節省人力操作的時間外,對於一般使用者來說,也可以維持一致的資料操作流程,並避免使用者不小心的操作錯誤。例如當某項資料變更時,必須更動到5個資料表的內容,那麼將更新步驟寫成預存程序來執行,不但省事,而且也不怕漏掉任何一個資料表。
重複使用:預存程序還可模組化(將大的程序分解成許多較小而且可以獨立運作的程序),以方便除錯、維護、或重複使用於不同的地方。例如當我們要將「地址」資料分解成「市、街、號、樓」4個字串時,可寫一個預存程序來處理,那麼以後在任何地方只要執行此預存程序,即可完成分解地址的工作。
安全性:當資料表需要保密時,我們可以利用預存程序來作為資料存取的管道。例如當使用者沒有某資料表的存取權限時,我們可以設計一個預存程序供其執行,以存取該資料表中的某些資料,或進行特定的資料處理工作。此外,預存程序的內容還可以加密編碼,這樣別人就看不到預存程序中的程式了。
預存程序的種類
預存程序可分為3類:
系統預存程序(System stored procedures)
系統預存程序一律以sp_開頭,例如"sp_dboption"。此類預存程序為SQL Server內建的預存程序,通常是用來進行系統的各項設定、取得資訊或相關管理工作。
延伸預存程序(Extended stored procedures)
延伸預存程序通常是以xp_開頭,例如"xp_logininfo"。此類程序大多是以傳統的程式語言(例如C++)撰寫而成,其內容並不是儲存在SQL Server中,而是以DLL的形式單獨存在。
我們可以把延伸預存程序看成是SQL Server的外掛程式,它可以擴充SQL Server的功能,例如SQL Server沒有從網頁中萃取資料的能力,則我們可以撰寫一個DLL的延伸預存程序,以供SQL Server將之載入並執行。
使用者自訂的預存程序(User-defined stored procedures)
就是我們自己設計的預存程序,其名稱可以任意取,但最好不要以sp_或xp_開頭,以免造成混淆。自訂的預存程序會被加入所屬資料庫的預存程序項目中,並以物件的形式儲存。
用SQL語言建立預存程序
建立預存程序是使用CREATE PROCEDURE敘述,其語法如下:
預存程序的優點
預存程序中可以包含資料存取敘述、流程控制敘述、錯誤處理敘述...等在使用上非常有彈性。其優點有:
執行效率高:SQL Server會預先將預存程序編譯成一個執行計劃並儲存起來,因此每次執行預存程序時都不需要再重新編譯,如此可以加快執行速度。由此可知,我們應該將經常使用的一些操作寫成預存程序,來提高SQL Server的運作效率。
統一的操作流程:我們可以將複雜的工作製做成預存程序,如此除了節省人力操作的時間外,對於一般使用者來說,也可以維持一致的資料操作流程,並避免使用者不小心的操作錯誤。例如當某項資料變更時,必須更動到5個資料表的內容,那麼將更新步驟寫成預存程序來執行,不但省事,而且也不怕漏掉任何一個資料表。
重複使用:預存程序還可模組化(將大的程序分解成許多較小而且可以獨立運作的程序),以方便除錯、維護、或重複使用於不同的地方。例如當我們要將「地址」資料分解成「市、街、號、樓」4個字串時,可寫一個預存程序來處理,那麼以後在任何地方只要執行此預存程序,即可完成分解地址的工作。
安全性:當資料表需要保密時,我們可以利用預存程序來作為資料存取的管道。例如當使用者沒有某資料表的存取權限時,我們可以設計一個預存程序供其執行,以存取該資料表中的某些資料,或進行特定的資料處理工作。此外,預存程序的內容還可以加密編碼,這樣別人就看不到預存程序中的程式了。
預存程序的種類
預存程序可分為3類:
系統預存程序(System stored procedures)
系統預存程序一律以sp_開頭,例如"sp_dboption"。此類預存程序為SQL Server內建的預存程序,通常是用來進行系統的各項設定、取得資訊或相關管理工作。
延伸預存程序(Extended stored procedures)
延伸預存程序通常是以xp_開頭,例如"xp_logininfo"。此類程序大多是以傳統的程式語言(例如C++)撰寫而成,其內容並不是儲存在SQL Server中,而是以DLL的形式單獨存在。
我們可以把延伸預存程序看成是SQL Server的外掛程式,它可以擴充SQL Server的功能,例如SQL Server沒有從網頁中萃取資料的能力,則我們可以撰寫一個DLL的延伸預存程序,以供SQL Server將之載入並執行。
使用者自訂的預存程序(User-defined stored procedures)
就是我們自己設計的預存程序,其名稱可以任意取,但最好不要以sp_或xp_開頭,以免造成混淆。自訂的預存程序會被加入所屬資料庫的預存程序項目中,並以物件的形式儲存。
用SQL語言建立預存程序
建立預存程序是使用CREATE PROCEDURE敘述,其語法如下:
CREATE PROC[EDURE] procedure_name [;number]
[@parameter data_type [VARYING] [= default] [OUTPUT]]
[,...n]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION }]
[FOR REPLICATION]
AS sql_statement [...n]