| 優點 | 說明 |
|---|---|
| 效能優勢 | 編譯一次、重複執行、計畫快取重用、減少網路往返 (批次操作單次連線) |
| 維護性 | 修改 SP 不需重新部署用戶端、版本控管集中 |
| 安全性 | 授權 EXECUTE 權限而非直接 TABLE 權限、防 SQL Injection |
| 抽象層 | 用戶端隔離資料結構變更、介面穩定 |
| 頻寬節省 | 批次 SQL 單次傳輸、減少 Client-Server 交互 |
| 缺點 | 說明 | 緩解策略 |
|---|---|---|
| 可移植性差 | T-SQL 專屬,遷移 MySQL/PostgreSQL/Oracle 需大幅改寫 | 核心邏輯盡量用 ANSI SQL、OR 框架抽象、遷移時重寫 |
| 除錯困難 | 缺乏現代 IDE 除錯支援 (VS/SMSS 有限支援) | 單元測試、Print/RAISERROR 除錯、擴展事件追蹤 |
| 版本控管弱 | 程式碼在資料庫內,難以 Git 追蹤 | 腳本化部署 (Dacpac/Flyway/Liquibase)、將 SP 定義存檔案 |
| 雙重呼叫成本 | 呼叫類需先取得參數中繼資料再執行 (兩次往返) | 專案後期參數固定後,快取參數資訊至 XML/記憶體 |
| 邏輯分散 | 業務邏輯分散於應用層與資料層 | 架構規範:資料存取邏輯在 SP,商業規則在應用層 |
TRY...CATCH、XACT_ABORT ON、明確交易控制SET NOCOUNT ON、SET XACT_ABORT ON、SET ANSI_NULLS ONusp__ (如 usp_Order_Create)「復雜的資料處理用存儲過程,如有些報表處理,多條件多表聯合查詢,並做分頁處理。」