預存程序是 SQL Server 封裝業務邏輯、提升效能、強化安全的核心機制。本文條列四大優勢 (預編譯、降低網路傳輸、程式碼重用、權限隔離),並以倉庫存貨查詢為例,展示從動態 SQL 重構為參數化預存程序的完整過程。
| 優勢 | 說明 |
|---|---|
| 預編譯執行計畫 | 首次執行編譯,後續重用計畫,消除重複編譯開銷,顯著提升高頻呼叫效能。 |
| 縮減網路傳輸 | 客戶端僅發送 EXEC proc @param,取代冗長 SQL 文本,低頻寬環境效果明顯。 |
| 程式碼重用與封裝 | 多應用、多使用者共享邏輯,修改僅需更新 SP,不動應用程式碼,縮短開發週期。 |
| 安全性隔離 | 授予 EXECUTE 權限而非直接表權限,實現資料存取最小權限原則。 |
-- 客戶端程式碼 (如 ASP.NET, Java) string sql = "SELECT Product, Quantity FROM Inventory WHERE Warehouse = '" + txtWarehouse.Text + "'"; cmd.CommandText = sql; -- 每次重新編譯、傳輸長 SQL、需表權限、有注入風險
-- 1. 建立 SP CREATE PROCEDURE sp_GetInventory @location VARCHAR(10) AS BEGIN SELECT Product, Quantity FROM Inventory WHERE Warehouse = @location; END; GO -- 2. 客戶端呼叫 EXEC sp_GetInventory 'FL'; -- 或 EXEC sp_GetInventory 'NY'
| ID | Product | Warehouse | Quantity |
|---|---|---|---|
| 142 | Green beans | NY | 100 |
| 214 | Peas | FL | 200 |
| 825 | Corn | NY | 140 |
| 512 | Lima beans | NY | 180 |
| 491 | Tomatoes | FL | 80 |
| 379 | Watermelon | FL | 85 |
呼叫 EXEC sp_GetInventory 'FL' 回傳 Peas 200、Tomatoes 80、Watermelon 85。
RETURN @int 或 @param OUTPUT,避免結果集開銷。TRY...CATCH 區塊統一異常處理。