SQL Server 存储过程开发三层结构规范

以下是《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_errorsp_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_ 可增强可读性(可选)

七、结语

本三层结构规范可适配于:

  • 高并发、高一致性交易系统(如订单、支付)

  • 多人协作、多阶段开发流程

  • 数据中台及多租户服务架构

通过主业务抽象化、事务封装化、功能原子化,提高可维护性、可测试性和系统稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接上篇,解决FramePack启动报错:“httpx.ReadError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。“的问题

#工作记录 FramePack部署&#xff08;从PyCharm解释器创建和使用开始&#xff09;保姆级教程-CSDN博客 上篇我们记录到FramePack从克隆到启动调试的保姆级教程&#xff0c;关于启动时会报以下错误的问题&#xff0c;已作出解决&#xff1a; 报错摘录&#xff1a; (.venv) PS F…

ping_test_parallel.sh 并行网络扫描脚本

并行网络扫描脚本分析&#xff1a;提高网络探测效率 引言脚本概述核心代码分析颜色定义与初始化并行处理机制并行执行与进程控制结果处理与统计 技术亮点性能分析结论附录&#xff1a;完整脚本 引言 在网络管理和运维过程中&#xff0c;快速检测网段内主机的在线状态是一项常见…

leetcode 3342. 到达最后一个房间的最少时间 II 中等

有一个地窖&#xff0c;地窖中有 n x m 个房间&#xff0c;它们呈网格状排布。 给你一个大小为 n x m 的二维数组 moveTime &#xff0c;其中 moveTime[i][j] 表示在这个时刻 以后 你才可以 开始 往这个房间 移动 。你在时刻 t 0 时从房间 (0, 0) 出发&#xff0c;每次可以移…

关于vue-office在vue3工程中的引用报错问题

在vue3项目工程中&#xff0c;根据vue-office文档在vue2中的引用&#xff1a; //引入VueOfficeDocx组件 相关样式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 报错信息&#xff1a; [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷键】

以下是 macOS 最常用快捷键列表&#xff0c;按使用频率由高到低分类整理&#xff0c;涵盖日常操作、效率工具及系统控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基础高频操作 快捷键功能说明Command C复制选中内容Command V粘贴Command X剪切Command Z撤销上一…

mdadm 报错: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 时发现 md/001 的测试失败了 单独执行&#xff0c;最后定位到是 mdadm 命令报错: buffer overflow detected 这个 bug 目前已经修复: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安装并且配置成功?(Android studio安装前的准备)

WinR输入cmd打开命令提示窗口 输入命令 java -version 回车显示如下&#xff1a;

STM32智能刷卡消费系统(uC/OS-III)

一、项目概述与开发背景 本系统是一款基于STM32微控制器的智能刷卡消费终端&#xff0c;集成RFID识别、OLED显示、Flash存储、蓝牙通信等核心模块。项目采用uC/OS-III实时操作系统实现多任务并发处理&#xff0c;适用于校园一卡通、企业食堂等小额支付场景。系统支持定额扣款、…

[人机交互]以用户为中心的交互设计

一.以用户为中心设计的两个特征 • 理解和指定产品的使用上下文 &#xff0c;并用于指导设计 • 用户参与式开发 • 参与 评估研究 &#xff08;第十 — 十四章&#xff09; • 参与 设计过程 &#xff1a;用户作为合作设计人员 二.用户参与设计的重要性 ◦ 需求的获取主要来源…

Abaqus学习笔记

目录 Abaqus介绍 学习资源 ​编辑Abaqus/CAE abaqus下载安装 abaqus基本操作 Abaqus启动 新建模型 ​编辑 ​编辑修改界面背景 ​编辑​编辑结果信息的显示与否 ​编辑计算结果信息字体设置 ​编辑允许多绘图状态 单位量纲 视图操作 事前说明 ODB文件 本构关系…

论坛系统开发(0-1) (上 前置知识介绍)

前置知识 1. 软件的生命周期 生命周期: 对事物进行定义(描述) -> 创建 -> 使用 -> 销毁的过程 软件⽣命周期中以划分为可⾏性研究、需求分析、概要设计、详细设计、实现、组装(集成)测试、确认测试、使⽤、维护、退役10个阶段&#xff0c;如下图&#xff1a; a. 可…

架构师面试(三十七):监控系统架构模式

题目 监控是在产品生命周期的运维环节&#xff0c;能对产品的关键指标数据进行【实时跟踪】并对异常数据进行【实时报警】。 一句话描述&#xff0c;监控系统可以帮我们【主动预防和发现】业务系统中的问题。 我们常说&#xff0c;监控系统是 “粮草”&#xff0c;业务系统是…

【面试 · 二】JS个别重点整理

目录 数组方法 字符串方法 遍历 es6 构造函数及原型 原型链 this指向 修改 vue事件循环Event Loop FormData 数组方法 改变原数组&#xff1a;push、pop、shift、unshift、sort、splice、reverse不改变原属组&#xff1a;concat、join、map、forEach、filter、slice …

深度学习里程碑:AlexNet 架构解析与核心技术详解

内容摘要 本文深度解析2012年ILSVRC冠军模型AlexNet&#xff0c;全面阐述其在深度学习发展中的关键突破。从模型架构出发&#xff0c;详细解析卷积层、池化层、全连接层的数学原理&#xff0c;重点分析ReLU激活函数、LRN局部归一化、重叠池化等创新技术的数学表达与工程价值。…

第5章 深度学习和卷积神经网络

深度学习是人工智能的一种实现方法。本章我们将考察作为深度学习的代表的卷积神经网络的数学结构。 5-1小恶魔来讲解卷积神经网络的结构 深度学习是重叠了很多层的隐藏层&#xff08;中间层&#xff09;的神经网络。这样的神经网络使隐藏层具有一定的结构&#xff0c;从而更加…

JVM——JVM是怎么实现invokedynamic的?

JVM是怎么实现invokedynamic的&#xff1f; 在Java 7引入invokedynamic之前&#xff0c;Java虚拟机&#xff08;JVM&#xff09;在方法调用方面相对较为“僵化”。传统的Java方法调用主要依赖于invokestatic、invokespecial、invokevirtual和invokeinterface这四条指令&#x…

STM32教程:ADC原理及程序(基于STM32F103C8T6最小系统板标准库开发)*详细教程*

前言: 本文章介绍了STM32微控制器的ADC外设,介绍了ADC的底层原理以及基本结构,介绍了ADC有关的标准库函数,以及如何编写代码实现ADC对电位器电压的读取。 可以根据基本结构图来编写代码 大体流程: 1、开启RCC时钟(包括ADC和GPIO的时钟,另外ADCCLK的分频器,也需要配置…

2025年APP安全攻防指南:抵御DDoS与CC攻击的实战策略

2025年&#xff0c;随着AI技术与物联网设备的深度渗透&#xff0c;DDoS与CC攻击的复杂性和破坏性显著升级。攻击者通过伪造用户行为、劫持智能设备、利用协议漏洞等手段&#xff0c;对APP发起精准打击&#xff0c;导致服务瘫痪、用户流失甚至数据泄露。面对这一挑战&#xff0c…

STM32的定时器

定时器的介绍 介绍&#xff1a;STM32F103C8T6微控制器内部集成了多种类型的定时器&#xff0c;这些定时器在嵌入式系统中扮演着重要角色&#xff0c;用于计时、延时、事件触发以及PWM波形生成、脉冲捕获等应用。 *几种定时器&#xff08;STM32F103系列&#xff09;&#xff1…

算法中的数学:约数

1.求一个整数的所有约数 对于一个整数x&#xff0c;他的其中一个约数若为i&#xff0c;那么x/i也是x的一个约数。而其中一个约数的大小一定小于等于根号x&#xff08;完全平方数则两个约数都为根号x&#xff09;&#xff0c;所以我们只需要遍历到根号x&#xff0c;然后计算出另…