以下是《SQL Server 存儲過程開發三層結構規范》的正式文檔結構,適用于企業級數據庫應用開發場景,有助于團隊協作、代碼審查與自動化運維:
📘 SQL Server 存儲過程開發三層結構規范
一、架構設計總覽
三層結構簡介
層級 | 命名約定 | 主要職責 |
---|---|---|
主業務層(Main) | sp_<模塊名>_<功能名>_main | 控制業務主流程,負責對外接口 |
事務控制層(Tx) | sp_<模塊名>_<功能名>_tx | 管理事務邊界與子功能協調 |
基礎功能層(Fn) | sp_<模塊名>_<功能名>_fn_<功能名> | 實現原子功能邏輯,便于復用 |
二、命名規范
-
模塊名、功能名采用小寫英文下劃線分隔,表達清晰業務含義。
-
所有存儲過程前綴統一使用
sp_
。 -
示例:
-
主業務層:
sp_order_create_main
-
事務控制層:
sp_order_create_tx
-
基礎功能層:
sp_order_create_fn_inventory
-
三、各層職責定義
🔷 1. 主業務層(Main)
內容 | 要求 |
---|---|
輸入參數 | 僅接收應用調用層傳入的業務參數 |
調用形式 | 只調用對應的 _tx 層過程 |
日志 | 可打印起始日志,但業務日志由 Tx 層統一處理 |
返回形式 | SELECT 200 AS code, '成功' AS msg ,可附帶業務ID等字段 |
約束 | 不直接處理事務,不訪問數據庫表,不直接嵌入業務邏輯 |
? 面向應用系統的唯一調用入口。
🔷 2. 事務控制層(Tx)
內容 | 要求 |
---|---|
輸入參數 | 繼承主層參數,并補充必要中間參數 |
輸出參數 | 必須提供 @ResultCode 和 @ResultMsg |
事務控制 | 必須包含 BEGIN TRAN / COMMIT / ROLLBACK |
異常處理 | 使用 TRY...CATCH 捕獲所有異常并回滾事務 |
日志 | 統一調用 sp_log_error 、sp_log_trace 等日志過程 |
調用 | 只調用 fn_ 前綴的功能層過程,保證原子性 |
? 是事務安全與一致性的守護者。
🔷 3. 基礎功能層(Fn)
內容 | 要求 |
---|---|
功能粒度 | 單一職責,易于復用和測試 |
輸入/輸出 | 使用參數或表變量作為輸入輸出 |
不包含 | 事務控制、異常捕獲、日志打印、SELECT 輸出 |
命名 | sp_<模塊名>_<功能名>_fn_<功能子項> ,如 sp_order_create_fn_price |
? 聚焦功能實現,保持高內聚低耦合。
四、錯誤處理與返回標準
錯誤輸出結構
SELECT 500 AS code, ERROR_MESSAGE() AS msg;
成功輸出結構
SELECT 200 AS code, '處理成功' AS msg, @OrderId AS order_id;
日志規范
-
錯誤日志過程:
sp_log_error(@ProcName, @ErrMsg)
-
操作日志過程:
sp_log_trace(@ProcName, @Detail)
五、標準開發模板
? 主業務層模板(Main)
CREATE PROCEDURE sp_user_register_main@UserName NVARCHAR(50),@Password NVARCHAR(50)
AS
BEGINDECLARE @ResultCode INT, @ResultMsg NVARCHAR(200);EXEC sp_user_register_tx@UserName = @UserName,@Password = @Password,@ResultCode = @ResultCode OUTPUT,@ResultMsg = @ResultMsg OUTPUT;SELECT @ResultCode AS code, @ResultMsg AS msg;
END
? 事務控制層模板(Tx)
CREATE PROCEDURE sp_user_register_tx@UserName NVARCHAR(50),@Password NVARCHAR(50),@ResultCode INT OUTPUT,@ResultMsg NVARCHAR(200) OUTPUT
AS
BEGINBEGIN TRYBEGIN TRAN;EXEC sp_user_register_fn_check @UserName;EXEC sp_user_register_fn_insert @UserName, @Password;COMMIT TRAN;SET @ResultCode = 200;SET @ResultMsg = '用戶注冊成功';END TRYBEGIN CATCHROLLBACK TRAN;SET @ResultCode = 500;SET @ResultMsg = ERROR_MESSAGE();EXEC sp_log_error 'sp_user_register_tx', @ResultMsg;END CATCH
END
? 基礎功能層模板(Fn)
CREATE PROCEDURE sp_user_register_fn_insert@UserName NVARCHAR(50),@Password NVARCHAR(50)
AS
BEGININSERT INTO Users(UserName, PasswordHash)VALUES (@UserName, HASHBYTES('SHA2_256', @Password));
END
六、附加建議
方面 | 建議 |
---|---|
模塊組織 | 按模塊分類存儲過程腳本文件夾 |
CI/CD | 建議使用腳本版本控制系統,如 Flyway、DbUp |
安全性 | 權限隔離,開發只讀,發布執行權限 |
單元測試 | 為每個 fn_ 層編寫測試用例,確保冪等性 |
參數命名 | 使用前綴 @in_ , @out_ 可增強可讀性(可選) |
七、結語
本三層結構規范可適配于:
-
高并發、高一致性交易系統(如訂單、支付)
-
多人協作、多階段開發流程
-
數據中臺及多租戶服務架構
通過主業務抽象化、事務封裝化、功能原子化,提高可維護性、可測試性和系統穩定性。