阅读量:34
1. 基础语法规范
在Debian上编写SQL Server存储过程需使用T-SQL语言,核心语法结构如下:
USE <目标数据库名>; -- 切换至需创建存储过程的数据库
GO
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'<用户名>.<存储过程名>') AND type IN (N'P', N'PC'))
DROP PROCEDURE <用户名>.<存储过程名>; -- 避免重复创建,先删除已有同名过程
GO
SET ANSI_NULLS ON; -- 统一NULL处理方式(推荐开启)
SET QUOTED_IDENTIFIER ON; -- 字符串常量使用双引号(推荐开启)
GO
CREATE PROCEDURE <用户名>.<存储过程名>
[@参数1 数据类型 [=默认值] [OUTPUT], -- 输入/输出参数定义(OUTPUT需显式声明)
@参数2 数据类型 [=默认值] [OUTPUT],
...]
AS
BEGIN
SET NOCOUNT ON; -- 禁止返回受影响的行数(提升性能)
-- 存储过程主体SQL语句(如SELECT/INSERT/UPDATE/DELETE等)
-- 可包含IF...ELSE、WHILE等逻辑控制语句
END;
GO
注:<用户名>通常为dbo(默认架构),若需指定其他架构需替换为对应名称。
2. 命名规范
-
存储过程名称:采用
P_<调用分类>_<功能分类>_<详细名称>格式,其中:P:标识存储过程(Procedure的首字母);- 调用分类:
GY(公用类)、NB(内部用); - 功能分类:
CX(查询)、WH(数据维护)、YW(业务处理); - 详细名称:与功能相关的汉语拼音首字母(如“获取用户详情”为
GetUserDetail)。
示例:P_NB_YW_GFQS(内部业务-工单发起)。
-
参数命名:输入参数以
@a开头+变量类型前缀+名称(小写),内部变量以@开头+变量类型前缀+名称(小写)。- 参数类型前缀:
@ai_(int)、@asvc_(varchar)、@adt_(datetime)等; - 变量类型前缀:
@i_(int)、@vc_(varchar)、@dt_(datetime)等。
示例:输入参数@aUserId(用户ID,int类型)、内部变量@iCount(计数,int类型)。
- 参数类型前缀:
3. 变量与参数规范
-
参数定义:
- 必须使用
@符号开头,数据类型需明确(如INT、VARCHAR(50)); - 输出参数需添加
OUTPUT关键字(如@Result INT OUTPUT); - 避免使用
TEXT、NTEXT、IMAGE等过时数据类型(优先用VARCHAR(MAX)、NVARCHAR(MAX))。
- 必须使用
-
变量定义:
- 局部变量以
@开头,需在BEGIN...END块内用DECLARE语句定义(如DECLARE @iTemp INT;); - 变量赋值用
SET(如SET @iTemp = 10;)或SELECT(如SELECT @iTemp = COUNT(*) FROM Users;)。
- 局部变量以
4. 错误处理与事务规范
- 错误处理:使用
TRY...CATCH结构捕获异常,确保错误信息可追踪:BEGIN TRY -- 业务逻辑SQL语句(如INSERT/UPDATE) END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); -- 获取错误信息 DECLARE @ErrorSeverity INT = ERROR_SEVERITY(); -- 错误严重级别 DECLARE @ErrorState INT = ERROR_STATE(); -- 错误状态 RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState); -- 抛出错误 RETURN -1; -- 返回错误码(自定义,如-1表示执行失败) END CATCH; - 事务控制:涉及多步数据修改时,使用
BEGIN TRANSACTION、COMMIT、ROLLBACK保证原子性:BEGIN TRY BEGIN TRANSACTION; -- 第一步操作(如UPDATE) -- 第二步操作(如INSERT) COMMIT TRANSACTION; -- 提交事务 RETURN 0; -- 返回成功码(自定义,如0表示成功) END TRY BEGIN CATCH IF @@TRANCOUNT > 0 -- 检查是否有未提交的事务 ROLLBACK TRANSACTION; -- 回滚事务 -- 错误处理(同上) END CATCH;
5. 注释与可读性规范
- 过程头部注释:在
CREATE PROCEDURE语句前添加详细说明,包括功能、输入/输出参数、返回值、作者、修改日期等:/* 功能:根据用户ID获取用户详细信息 输入参数:@aUserId(用户ID,int类型) 输出参数:无 返回值:0(成功)、-1(失败) 作者:张三 修改日期:2025-11-01 */ - 内部注释:每段复杂逻辑前添加注释,说明操作目的(如
-- 统计用户订单数量)。
6. 性能与安全规范
- **避免SELECT ***:明确指定查询字段(如
SELECT UserID, UserName FROM Users),减少不必要的数据传输。 - 使用参数化查询:避免SQL注入,所有用户输入均通过参数传递(如
EXEC GetEmployeeByID @EmployeeID = 1)。 - 合理使用索引:确保查询涉及的字段有适当索引(如WHERE条件中的字段)。
- 权限控制:仅授予存储过程必要的权限(如
EXECUTE权限),避免直接访问表。
7. 加密与维护规范
- 加密过程定义:若需隐藏存储过程逻辑,可使用
WITH ENCRYPTION选项(一旦加密无法解密):CREATE PROCEDURE dbo.GetEmployeeDetails WITH ENCRYPTION -- 加密过程定义 AS BEGIN SELECT * FROM Employees; END; GO - 版本控制:定期备份存储过程脚本,纳入版本控制系统(如Git),记录修改历史。