| 優勢 | 說明 |
|---|---|
| 預先編譯執行計畫 | 建立時編譯,重複呼叫重用計畫,減少編譯 CPU 開銷。 |
| 降低網路傳輸 | 將冗長 SQL 壓縮為單行呼叫(EXEC proc @p1, @p2),節省頻寬與延遲。 |
| 程式碼重用與模組化 | 多應用程式共用同一邏輯,修改集中在資料庫端,減少部署成本。 |
| 強化安全性 | 授權使用者 EXECUTE 權限於程序,無需授予底層資料表 SELECT/INSERT/UPDATE/DELETE 權限。 |
CREATE PROCEDURE dbo.ProcName
@InputParam INT,
@OutputParam INT OUTPUT
AS
BEGIN
SET NOCOUNT ON; -- 減少網路封包(DONE_IN_PROC)
-- 邏輯處理
SELECT @OutputParam = COUNT(*) FROM dbo.Table WHERE Col = @InputParam;
RETURN 0; -- 回傳狀態碼
END;
GO
情境:倉管人員頻繁查詢庫存量與可出貨量。
CREATE PROCEDURE dbo.GetInventoryStatus
@ProductID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
p.ProductName,
i.QtyOnHand,
i.QtyAvailable,
CASE WHEN i.QtyAvailable > 0 THEN '可出貨' ELSE '缺貨' END AS Status
FROM dbo.Inventory i
JOIN dbo.Products p ON p.ProductID = i.ProductID
WHERE i.ProductID = @ProductID;
END;
GO
前端僅需呼叫 EXEC dbo.GetInventoryStatus @ProductID = 123,不需知道表結構與聯結邏輯。
sp_executesql 參數化,防止注入。TRY...CATCH 區塊搭配 THROW (SQL 2012+) 或 RAISERROR。BEGIN TRAN...COMMIT/ROLLBACK,注意巢狀交易計數 @@TRANCOUNT。dbo.動詞_名詞(如 Get_OrderDetail)。OUTPUT。SET NOCOUNT ON、SET XACT_ABORT ON(交易自動回滾)。SELECT *,明確列出欄位。