当前位置: 首页 > java >正文

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.xdnf.cn/news/4593.html

相关文章:

  • 生物化学笔记:神经生物学概论12 大脑全景图 知觉、行为和语言 注意力
  • vue3的页面跳转方法汇总(路由跳转,组件跳转)
  • 微信小程序开发,登录注册实现
  • ​​Dongle​​(中文常称“加密狗”或“适配器”)
  • 智慧医疗时代下的医疗设备智能控费系统解决方案
  • 【C++】C++中的类型转换
  • GoFrame框架下优雅使用Redis:从入门到实战的最佳实践
  • docker搭建DeepSeek+Dify构建个人知识库
  • 在 Ubuntu 系统中,挂起(Suspend)和休眠(Hibernate)
  • 如何做界面自动化工具选择?
  • 深入解析Spring Boot项目目录结构:从新手到规范实践
  • Git 撤销已commit但未push的文件
  • overflow使用
  • 力扣热题100之回文链表
  • Python学习之路(八)-多线程和多进程浅析
  • 《MySQL:MySQL索引特性》
  • 解锁 Postgres 扩展日!与瀚高共探 C/Java 跨语言扩展技术的边界与未来
  • si551x时钟芯片linux下调试总结
  • 基于 SpringBoot + Vue 的校园管理系统设计与实现
  • STM32的看门狗
  • English of Root for May 7th
  • 工程师转型算法工程师 深入浅出理解transformer-手搓板
  • zst-2001 历年真题 知识产权
  • 端口安全配置
  • Docker+Kubernetes落地指南:从单机到集群的平滑迁移
  • 【大模型系列篇】Qwen3思考预算及思考模式切换实现原理探索
  • Qt 中基于 spdlog 的高效日志管理方案
  • nginx 上传文件,413 request entity too large
  • 计划评审技术PERT
  • Yii2.0 模型规则(rules)详解