預編譯、存儲於數據庫中的 SQL 代碼塊,接受參數、執行業務邏輯、返回結果。核心優勢:
| 類型 | 前綴 | 用途 | 示例 |
|---|---|---|---|
| 系統存儲過程 | sp_ | 系統配置、元數據查詢、管理任務 | sp_help, sp_who, sp_spaceused |
| 擴展存儲過程 | xp_ | 調用 OS 功能、外部 DLL、網絡操作 | xp_cmdshell, xp_sendmail |
| 用戶自定義存儲過程 | 無固定前綴(建議 usp_) | 業務邏輯封裝 | usp_GetCustomerOrders |
CREATE PROCEDURE [schema.]procedure_name
[ @parameter_name data_type [ = default ] [ OUTPUT ] ] [ ,...n ]
[ WITH { RECOMPILE | ENCRYPTION | EXECUTE AS clause } ]
AS
BEGIN
-- SQL 语句块
RETURN integer_return_code
END
關鍵選項:
OUTPUT:標記輸出參數,調用端可讀取返回值。WITH RECOMPILE:每次執行重新編譯,適用參數嗅探導致計劃不穩定場景。WITH ENCRYPTION:加密定義文本,防止直接查看(非高強度加密)。| 機制 | 類型 | 適用場景 | 調用端獲取方式 |
|---|---|---|---|
| RETURN | INT | 執行狀態碼(0 成功,非 0 錯誤代碼) | ParameterDirection.ReturnValue |
| OUTPUT 參數 | 任意標量類型 | 單值/少量標量返回(如新生成 ID、聚合結果) | ParameterDirection.Output |
| 結果集 | 表格數據 | 多行多列數據返回(查詢、報表) | ExecuteReader / Fill(DataSet) |
CREATE PROC usp_QueryBooks
AS
SELECT BookID, Title, Price FROM Books;
GO
EXEC usp_QueryBooks;
CREATE PROC usp_InsertBook
@BookID CHAR(10),
@Title VARCHAR(20),
@Price MONEY,
@TotalPrice MONEY OUTPUT
WITH ENCRYPTION
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO Books (BookID, Title, Price) VALUES (@BookID, @Title, @Price);
SELECT @TotalPrice = SUM(Price) FROM Books;
COMMIT TRANSACTION;
RETURN 0;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
RETURN ERROR_NUMBER();
END CATCH
END
GO
-- 調用示例
DECLARE @Total MONEY;
EXEC usp_InsertBook '003', 'Delphi 控件開發指南', 100, @Total OUTPUT;
PRINT '總金額: ' + CAST(@Total AS VARCHAR);
CREATE PROC usp_SalesSummary
AS
BEGIN
SELECT
p.ProductID, p.ProductName,
o.CustomerName, o.Deposit,
p.OrderQty * o.Deposit AS TotalAmount
INTO #TempSales
FROM Products p
INNER JOIN Orders o ON p.ProductID = o.ProductID;
IF @@ERROR = 0
PRINT 'Success';
ELSE
PRINT 'Failed';
SELECT * FROM #TempSales; -- 返回結果集
END
usp_[Module_]Action[ByCondition](如 usp_Sales_GetOrdersByDateRange)。