Sql Server系列:存储过程
1 存儲過程簡介
存儲過程是使用T-SQL代碼編寫的代碼段。在存儲過程中,可以聲明變量、執行條件判斷語句等其他編程功能。在MS SQL Server 2012中存儲過程主要分三類:系統存儲過程、自定義存儲過程和擴展存儲過程。
存儲過程的優點:
? 存儲過程加快系統允許速度,存儲過程只在創建時編譯,以后每次執行時不需要重新編譯。
? 存儲過程可以封裝復雜的數據庫操作,簡化操作流程。
? 可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的數據庫訪問接口,改進應用程序的可維護性。
? 存儲過程可以增強代碼的安全性。
? 存儲過程可以降低網絡流量,存儲過程代碼直接存儲在數據庫中,在客戶端與服務器的通訊過程中,不會產生大量的T-SQL代碼流量。
存儲過程的缺點:
? 數據庫移植不方便,存儲過程依賴于數據庫管理系統,MS SQL Server 2012存儲過程中封裝的操作代碼不能直接移植到其他數據庫系統中。
? 不支持面向對象的設計,無法采用面向對象的方式將邏輯業務進行封裝。
? 不易維護
? 不支持集群
1.1 系統存儲過程
系統存儲過程是有MS SQL Server 2012系統自身提供的存儲過程,可以作為命令執行各種操作。系統存儲過程主要用來從系統表中獲取信息,使用系統存儲過程完成數據庫服務器的管理工作。系統存儲過程位于數據庫服務器中,并以sp_開頭,系統存儲過程定義在系統定義和用戶定義的數據庫中,在調用時不必在存儲過程前加數據庫限定名。
系統存儲過程創建并存儲于系統數據庫master中。
1.2 自定義存儲過程
自定義存儲過程即用戶使用T-SQL語句編寫的、為了實現某一特定業務需求,在用戶數據庫中編寫的T-SQL語句集合,用戶存儲過程可以接受輸入參數、向客戶端返回結果和信息、返回輸出參數等。
創建自定義存儲過程時,存儲過程名前面加上##表示創建一個全局的臨時存儲過程;存儲過程名前面加上#表示創建局部臨時存儲過程。局部臨時存儲過程只能在創建它的會話中使用,會話結束時,將被刪除。這兩種存儲過程都存儲在tempdb數據庫中。
1.3 擴展存儲過程
擴展存儲過程是以在SQL Server 2012環境外執行的DLL來實現的。擴展存儲過程以前綴xp_標識。
2 創建及執行存儲過程
CREATE PROCEDURE語句的語法格式:
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type }[ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]] [ ,...n ] [ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ] AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;]EXECUTE存儲過程的語法格式:
[ { EXEC | EXECUTE } ]{ [ @return_status = ]{ module_name [ ;number ] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] }][ ,...n ][ WITH <execute_option> [ ,...n ] ]} [;]示例:
CREATE PROCEDURE USP_GetAllProducts ASSELECT [ProductID],[ProductName],[UnitPrice],[UnitsInStock],[CreateDate]FROM [dbo].[Product] EXECUTE USP_GetAllProducts帶輸入參數的存儲過程:
CREATE PROCEDURE USP_GetByProductID (@ProductID INT ) ASSELECT [ProductID],[ProductName],[UnitPrice],[UnitsInStock],[CreateDate]FROM [dbo].[Product]WHERE [ProductID] = @ProductID EXECUTE USP_GetByProductID @ProductID = 1帶輸出參數的存儲過程:
CREATE PROCEDURE USP_GetTotalRecordsByCategoryID (@CategoryID INT,@TotalRecords INT OUTPUT ) ASSELECT @TotalRecords = COUNT(1) FROM [dbo].[Product]WHERE [CategoryID] = @CategoryID DECLARE @TotalProducts INT EXECUTE USP_GetTotalRecordsByCategoryID @CategoryID = 1, @TotalRecords = @TotalProducts OUTPUT SELECT @TotalProducts DECLARE @TotalProducts INT EXECUTE USP_GetTotalRecordsByCategoryID 1, @TotalProducts OUTPUT SELECT @TotalProducts3 修改存儲過程
修改存儲過程語法格式:
ALTER { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]] [ ,...n ] [ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ] AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;]4 查看存儲過程
查看存儲過程結構:
EXEC sp_help USP_GetTotalRecordsByCategoryID查看存儲過程文本:
EXEC sp_helptext USP_GetTotalRecordsByCategoryID5 刪除存儲過程
刪除存儲過程語法:
DROP { PROC | PROCEDURE } { [ schema_name. ] procedure } [ ,...n ]示例:
DROP PROCEDURE USP_GetTotalRecordsByCategoryID6 使用WITH RECOMPILE選項
使用WITH RECOMPILE選項可以確保為特定的某次運行創建新的計劃,使用該選項的兩種方式:
? 在運行時包含WITH RECOMPILE
EXECUTE USP_GetAllProducts WITH RECOMPILE? 在存儲過程中包含WITH RECOMPILE選項。
在CREATE PROC或ALTER PROC語句中的AS語句前添加WITH RECOMPILE選項。
7 遞歸存儲過程
SQL Server最多可以進行32次遞歸,超出則會引發錯誤并停止處理。
CREATE PROC USP_Factorial (@ValueIn INT,@ValueOut INT OUTPUT ) ASDECLARE @InWorking INTDECLARE @OutWorking INTIF @ValueIn >= 1BEGINSELECT @InWorking = @ValueIn - 1EXEC USP_Factorial @InWorking, @OutWorking OUTPUTSELECT @ValueOut = @ValueIn * @OutWorkingENDELSESET @ValueOut = 1 DECLARE @ValueOut INT EXEC USP_Factorial 5, @ValueOut OUTPUT SELECT @ValueOut轉載于:https://www.cnblogs.com/libingql/p/4166666.html
總結
以上是生活随笔為你收集整理的Sql Server系列:存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去留无意,漫随天外云卷云舒什么意思
- 下一篇: 网名特殊符号大全77个