SQL Server 存儲過程開發規范

SQL Server 存儲過程開發規范(高級版)

1. 總則

1.1 目標

本規范旨在:

  • 提高存儲過程的事務一致性異常可追蹤性錯誤透明度

  • 統一日志記錄錯誤碼管理鏈路追蹤(Trace ID)

  • 支持復雜事務場景(嵌套事務、分布式事務)

  • 為持續集成(CI/CD)提供自動化測試與發布支持

2. 存儲過程分層與職責

層次控制事務記錄異常日志返回狀態碼Trace ID說明
Main(主流程)????生成并傳遞 Trace ID,匯總狀態
SubTx(子事務)????獨立事務單元,異常即回滾
Func(功能操作)?可選可選?查詢或計算操作

3. 日志表設計(Log表標準化)

設計統一、專業的日志表,以支持問題追蹤和運維排查。

3.1 錯誤日志表結構(示例)

CREATE TABLE dbo.Proc_Error_Log (LogId BIGINT IDENTITY(1,1) PRIMARY KEY,TraceId UNIQUEIDENTIFIER NOT NULL, -- 鏈路IDProcName NVARCHAR(200) NOT NULL,    -- 存儲過程名稱ErrorCode INT NOT NULL,             -- 錯誤碼ErrorMessage NVARCHAR(2000) NOT NULL, -- 錯誤信息StackTrace NVARCHAR(MAX) NULL,       -- 堆棧追蹤信息(可選)CreateTime DATETIME2 NOT NULL DEFAULT GETUTCDATE(), -- UTC時間InputParams NVARCHAR(MAX) NULL,     -- 輸入參數快照(JSON格式)ExtraInfo NVARCHAR(MAX) NULL        -- 額外上下文信息(如服務器名、環境)
);

3.2 日志寫入示例

INSERT INTO dbo.Proc_Error_Log (TraceId, ProcName, ErrorCode, ErrorMessage, InputParams)
VALUES (@TraceId, 'proc_Order_Shipment_Main', @code, ERROR_MESSAGE(), @InputParams);

4. 統一錯誤代碼管理策略

4.1 錯誤碼分層設計

范圍說明
0成功
1000-1999業務校驗失敗(如庫存不足、余額不足)
2000-2999數據庫操作失敗(如更新失敗)
3000-3999外部系統調用失敗(如支付系統超時)
4000-4999系統異常(如死鎖、不可預知異常)

所有錯誤碼及含義應維護一張獨立表或配置文件,便于統一維護和前端適配。


5. Trace ID設計與使用

5.1 生成與傳遞

  • 在主流程入口生成 Trace ID(UUID)。

  • 通過參數傳遞到每個子事務和日志記錄,保證鏈路統一。

DECLARE @TraceId UNIQUEIDENTIFIER = NEWID();
EXEC proc_Order_Shipment_Main @OrderId, @TraceId, @code OUTPUT, @msg OUTPUT;

5.2 傳遞規范

  • 所有子過程均必須攜帶 @TraceId 參數。

  • 日志記錄必須關聯 TraceId,便于串聯問題定位。


6. 復雜事務控制規范

6.1 嵌套子事務(Savepoint)

子事務內部采用 SAVE TRANSACTION,保證局部回滾而非破壞主事務。

BEGIN TRANSACTION;
SAVE TRANSACTION SavePoint_SubTx1;BEGIN TRY-- 子操作
END TRY
BEGIN CATCHROLLBACK TRANSACTION SavePoint_SubTx1;THROW;
END CATCH

6.2 分布式事務(如調用外部數據庫)

必須顯式使用 BEGIN DISTRIBUTED TRANSACTION,并加快超時時間控制。


7. 存儲過程單元測試體系

7.1 Mock數據表設計

為存儲過程測試,設計專門的測試版表(如 Order_TestInventory_Test),與正式表結構一致,但獨立存在。

  • 測試存儲過程前,插入測試數據。

  • 測試結束后,清理數據,保證測試冪等性。

7.2 自動化測試腳本示例

-- Arrange
INSERT INTO Order_Test(OrderId, Status) VALUES (1, 'Pending');-- Act
DECLARE @code INT, @msg NVARCHAR(500);
EXEC proc_Order_Shipment_Main @OrderId = 1, @TraceId = NEWID(), @code OUTPUT, @msg OUTPUT;-- Assert
IF @code != 0PRINT 'Test Failed: ' + @msg;
ELSEPRINT 'Test Passed';

可以將測試腳本集成到CI流程中,保證每次變更均經過驗證。


8. 自動化部署策略

8.1 腳本編寫規范

  • 存儲過程腳本必須支持冪等執行(存在則更新)。

  • 示例:

IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_Order_Shipment_Main]') AND type = N'P')DROP PROCEDURE dbo.proc_Order_Shipment_Main;
GO
CREATE PROCEDURE dbo.proc_Order_Shipment_Main
AS
BEGIN-- 定義
END
GO

8.2 自動發布流程

  1. 開發者提交存儲過程腳本至版本庫(如 Git)。

  2. CI Pipeline自動檢測是否有變更。

  3. 自動化執行發布腳本,部署到測試環境或正式環境。

  4. 發布前自動備份舊版本存儲過程。


最后總結

關鍵能力規范提升點
日志記錄統一結構化存儲,關聯Trace ID
錯誤處理標準化錯誤碼體系
事務控制支持局部回滾、分布式事務
調試追蹤Trace ID貫穿調用鏈
測試保障mock表+自動化測試
自動部署冪等腳本+CI集成

通過這些規范,能夠讓SQL Server存儲過程開發真正具備企業級生產力,同時大幅降低維護成本和故障排查復雜度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78821.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opendds的配置

配置的使用 文檔中說明有4種使用配置的方式: 環境變量 命令行參數(將覆蓋環境變量中的配置) 配置文件(不會覆蓋環境變量或命令行參數中的配置) 用戶調用的 API(將覆蓋現有配置) 這里對開發…

(Go Gin)上手Go Gin 基于Go語言開發的Web框架,本文介紹了各種路由的配置信息;包含各場景下請求參數的基本傳入接收

1. 路由 gin 框架中采用的路優酷是基于httprouter做的 HttpRouter 是一個高性能的 HTTP 請求路由器,適用于 Go 語言。它的設計目標是提供高效的路由匹配和低內存占用,特別適合需要高性能和簡單路由的應用場景。 主要特點 顯式匹配:與其他路由…

Marin說PCB之----板材的替換注意事項

由于最近很多武林上的主流門派都需要采用將的本方案,小編所在的宗門古族也是不例外了,宗門大長老韓立現在想把之前一直在用的板材EM370Z替換成生益的Autolad3,讓我去拿資料分析一下是否可以替換。下圖所示是就是小編我做的一個表格關于兩家板…

4月28日信息差全景:國際局勢、科技突破與市場震蕩一、國際政治與安全:俄烏沖突關鍵轉折

一、國際政治與安全:俄烏沖突關鍵轉折 1. 烏克蘭反攻進展與情報差異 前線動態: 俄國防部稱在頓涅茨克擊退烏軍三次進攻,摧毀12輛坦克;烏方則宣布在巴赫穆特南部推進2公里,雙方戰報存在顯著差異。 信息差根源:戰場信息管控導致西方媒體與俄媒報道截然不同。 國際援助: 美…

關系數據的可視化

目錄 【實驗目的】 【實驗原理】 【實驗環境】 【實驗步驟】 一、安裝Python所需要的第三方模塊 二、實驗 【實驗總結】 【實驗目的】 1.掌握關系數據在大數據中的應用 2.掌握關系數據可視化方法 3. python 程序實現圖表 【實驗原理】 在傳統的觀念里面&#xff0…

夏季道路安全的AI革命:節省人力、提升效率

AI夏季道路安全:用智能算法守護每一條街道 背景:夏季道路安全的挑戰與機遇 夏季是道路安全事件的高發期。高溫天氣容易導致駕駛員疲勞、行人行為異常(如跌倒或中暑),同時,車流量增加、夜間活動頻繁…

HTML標記語言_@拉鉤教育【筆記】

目錄 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個頁面) 8.多媒體標簽(音/視頻) 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個…

Python 中調用方法內部定義的類詳解(類在方法中的各種操作)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、基本概念1.1 方法內部定義類概述1.2 方法內部定義類的特點1.3 替代方案二、基本使用2.1 直接在方法內部使用2.2 返回類定義供外部使用2.3 返回類的實例2.4 作為閉包使用(訪問外部變量)三、高級用法3.1 動態類創…

第36課 常用快捷操作——用“鼠標右鍵”退出當前命令

概述 在AD 20軟件中,很多的命令都是可以一直連續下去的,比方說放置一個元器件符號,如果你當中不取消的話,那就可以一直執行下去,放完一個接著放下一個,放完一個接著放下一個…… 想要退出這種連續進行的命…

FFTW3.3.10庫與QT結合的使用

FFTW(Fastest Fourier Transform in the West)是世界上最快的FFT, 實測計算長度為10000的double數組, 單次運行時間在2ms左右。為了詳細了解FFTW以及為編程方便,特將用戶手冊看了一下,并結合手冊制作了以下…

服務器異地備份,服務器異地備份有哪些方法?

服務器異地備份是應對區域性災難(如地震、火災、洪水)或人為事故(如誤刪除、勒索病毒攻擊)的關鍵策略,其核心在于將數據副本存儲在物理隔離的地理位置,確保主數據中心故障時仍可恢復業務。 以下是主流的異地…

導軌表面硬化處理有哪些?

導軌是機器工作的重要組成部分,它與滑塊緊密配合,保證機器的運轉精度和定位精度。為了提高導軌的耐磨性能和使用壽命,通常在導軌表面加工硬化層。硬化層一般是在導軌表面形成一層高硬度和高強度的薄層,有效地提高了導軌的耐磨性能…

Android Compose vs 傳統View系統:全面對比與選型指南

Android Compose vs 傳統View系統:全面對比與選型指南 一、引言 隨著Android Jetpack Compose的正式發布,Android開發迎來了全新的聲明式UI框架。本文將全面對比Compose與傳統View系統的差異,幫助開發者做出合理的技術選型。 二、核心架構…

C#中實現JSON解析器

JSON(JavaScript Object Notation)即 JavaScript 對象表示法,是一種輕量級的數據交換格式。 起源與發展 JSON 源于 JavaScript 編程語言,是 JavaScript 對象字面量語法的一個子集。但如今它已經獨立于 JavaScript,成為一種通用的數據格式,廣泛應用于各種編程語言和系統…

【Maven】子POM與父POM

文章目錄 子POM與父POM一、繼承的內容1.子 POM 可以繼承父 POM 的內容2.子 POM 中聲明相同配置覆蓋規則示例 子POM與父POM 一、繼承的內容 在 Maven 項目結構中,子 POM(子模塊)可以繼承父 POM 的很多配置。合理使用繼承機制可以大大減少重復…

12前端項目----添加購物車1.0

商品添加購物車 商品數量添加購物車瀏覽器本地存儲localStoragesessionStorage添加成功頁面 商品數量 輸入為數字&#xff0c;最少為1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…

EasyRTC嵌入式音視頻通信SDK助力視頻客服,開啟智能服務新時代

一、背景 在數字化服務浪潮下&#xff0c;客戶對服務體驗的要求日益提升&#xff0c;傳統語音及文字客服在復雜業務溝通、可視化指導等場景下漸顯不足。視頻客服雖成為企業服務升級的關鍵方向&#xff0c;但普遍面臨音視頻延遲高、畫質模糊、多端適配難、功能擴展性差等問題&a…

干貨分享|MaxKB智能問數方案及步驟詳解

DeepSeek-R1的發布掀起了AI智能變革的浪潮。在過去幾個月里&#xff0c;MaxKB開源企業級AI助手已經幫助大量企業和組織快速落地了DeepSeek&#xff0c;讓AI在不同的行業土壤中產生持續、可度量的業務價值。 MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09; 可以為本…

【python】數據類型小結

1.數據類型 int、float、str、bool、元組tuple、列表list、字典dict、集合set 分為兩類&#xff1a;可變和不可變數據類型 2.可變數據類型和不可變數據類型 當變量的值變化&#xff0c;內存地址不變則為可變數據類型&#xff0c; eg&#xff1a;int、float、bool、字符串st…

泰山派常用命令

0.連接adb 設備列表&#xff1a;adb devices 進入命令&#xff1a;adb shell 1.連接WiFi 查看當前網絡&#xff1a;nmcli con show 我的WiFi名稱&#xff1a;6 我的WiFi密碼&#xff1a;12345789 連接當前網絡&#xff1a;nmcli device wifi connect 6 password 1234578…