MS SQL 脚本编码规范
福州星网视易信息系统有限公司
更新记录:
版本 作者 日期 内容
黄晨东 SQL 脚本编写规范
蔡炆炆 基于 版本进行补充和整理
目录
Transact-SQL 编程规范 ....................................................................................................................1
一、 概述....................................................................................................................................1
1. 基本原则........................................................................................................................1
2. 基本规范........................................................................................................................1
二、 对象命名............................................................................................................................1
1. 数据库................................................................................................................................1
2. 数据库文件........................................................................................................................1
3. 数据表................................................................................................................................2
4. 数据视图............................................................................................................................2
5. 数据列................................................................................................................................2
6. 存储过程............................................................................................................................2
7. 函数....................................................................................................................................3
8. 用户定义数据类型............................................................................................................3
9. 主键、索引........................................................................................................................3
三、 参数命名............................................................................................................................3
1. 数据列参数....................................................................................................................3
2. 非数据列参数....................................................................................................................4
3. 常用字段命名....................................................................................................................4
四、 SQL 编写 ...........................................................................................................................4
1. 大小写................................................................................................................................4
2. 存储格式............................................................................................................................4
3. 类型选择............................................................................................................................4
4. 默认值................................................................................................................................5
5. 字段长度............................................................................................................................5
6. 使用“'” ...........................................................................................................................5
7. 语句缩进........................................................................................................................5
8. 语句换行........................................................................................................................5
9. 语句分割........................................................................................................................5
10. 使用“*” ..........................................................................................................................5
11. 表名别名........................................................................................................................5
12. 类型转换........................................................................................................................5
13. 数值比较........................................................................................................................6
14. 排序................................................................................................................................6
15. Unicode 字符串 .............................................................................................................6
16. BEGIN...END 块 ..........................................................................................................6
17. TOP 子句 .......................................................................................................................6
18. TRANSACTION 编写 ..................................................................................................6
19. 存储过程........................................................................................................................7
五、 代码注释............................................................................................................................7
1. 代码头部注释................................................................................................................7
2. TRANSACTION 注释 ..................................................................................................7
Transact-SQL 编程规范
一、 概述
本规范主要规定 SQL 脚本在书写过程中所应遵循的规则及注意事项。编写该规范的目的是
使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它
组员的代码,以便于源代码的二次开发记忆系统的维护。
1. 基本原则
以大小写敏感编写 SQL 语句。
尽量使用 Unicode 数据类型。
优先使用连接代替子查询或嵌套查询。
尽量使用参数化 SQL 查询代替语句拼接 SQL 查询。
尽量使用存储过程代替 SQL 语句。
禁止使用[拼音]+[英语]的方式来命名 SQL 对象或变量。
禁止使用触发器。
禁止在表间创建外键关系。
禁止创建自增长主键列
2. 基本规范
采用 Pascal 样式命名数据库对象。大写 T-SQL 语言的所有关键字,谓词和系统函数。
Pascal 大小写:
组成标识符的每个单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,
要求全部大写。
例如:ApplicationException
ID
二、 对象命名
1. 数据库
命名格式为[项目英文名称]。
示例:AdventureWorks
2. 数据库文件
数据文件:[数据库名称] +
日志文件:[数据库名称] +
示例:
3. 数据表
命名格式为 BL_TBL_+[表名]。
示例:BL_TBL_Employee
BL_TBL_Product
表名以英文单数命名。
示例:使用 BL_TBL_Product 而不是 BL_TBL_Products
4. 数据视图
命名格式为 BL_V_+ [视图名称]。
示例:BL_V_Employee
BL_V_SalesPerson
5. 数据列
列名称命名采用英文单词或缩写,英文单词只来自于具体业务定义,尽量表达清楚含义。命
名格式为[列名称]。
示例:AddressID
PostalCode
尽量避免使用拼音命名,如果不可避免,对于比较短的列名,采用拼音全写,如果拼音列名
比较复杂,可以采用首个字用全拼,其它字用首字母大写表示。
示例:宁波 Ningbo
经营方式 JingYFS
6. 存储过程
命名格式为 BL_HV_ +[存储过程名称]。
示例:BL_HV_GetUser
BL_HV_AddUser
每个过程必须要有两个输出参数@ErrorCode 和@ErrorMessage。
存储过程书写格式如下:
if exists(select 1 from sysobjects where id=object_id(‘bl_hv_Checkout’))
drop procedure bl_hv_Checkout
go
create procedure Checkout
(
….
@ErrorCode int output, --返回错误代码 0 表示成功 非 0 表示失败
@ErrorMessage varchar(100) output --返回错误信息
)
as
declare
@checkoutid int, --变量声明在此处 …
begin
…
end
go
7. 函数
命名格式为 BL_Fn_ +[函数名] 。
示例:BL_Fn_GetUser
系统函数使用全部大写。
示例:SELECT ISNULL(@LastName,'Unknown last name');
GETDATE()
8. 用户定义数据类型
命名格式为[自定义数据类型名称]。
示例:Flag
NameStyle
9. 主键、索引
主键: PK_[表名称]_[主键];如果是组合主键,使用 PK_[表名]_[主键 1]_[主键 2]。
示例:PK_ BL_TBL_Store_CustomerID
PK_ BL_TBL_StoreContact_CustomerID_ContactID
聚集索引:PK_[表名称]_[主键];如果是组合主键,使用 PK_[表名]_[主键 1]_[主键 2]。
示例:PK_Store_CustomerID
PK_StoreContact_CustomerID_ContactID
唯一非聚集索引:AK_[表名称]_[列名称]。
示例:AK_Store_rowguid
不唯一非聚集索引:PK_[表名称]_[列名称]。
示例:IX_Store_SalesPersonID
主 XML 索引:PXML_[表名称]_[Xml 类型列名称]。
示例:PXML_Store_Demographics
三、 参数命名
1. 数据列参数
命名格式为 @ + [列名称]。
示例:@EmployeeID
在列名不符合 Pascal 样式时(早期遗留系统),例如使用全部大写的列名称,或使用“_”进行
连接的字段名称,参数名称定义使用 @ + [列名称],这里的列名称尽量符合 Pascal 样式命
名。
2. 非数据列参数
在参数无法跟列名称进行关联时,使用能够反映该参数功能的英文单词或单词组合, 采用
Pascal 样式命名。
示例:@ErrorID
@Flag
3. 常用字段命名
这里的常用字段是指在建表时频繁使用的表名或列名,下表对常用字段进行建议性定义,
列名称 数据类型 说明
CreatedDate datetime 纪录创建日期,一般使用
GETDATE()自动生成
ModifiedDate datetime 纪录最后修改日期,首次使
用 GETDATE()
DeletedDate datetime 记录删除(标记删除)日期
StartDate datetime 开始日期
EndDate datetime 结束日期
StartTime datetime 开始时间
EndTime datetime 结束时间
ID int 使用 ID 代替 Id 或 id
ParentID int 父 ID
Status int 状态
四、 SQL 编写
1. 大小写
大写 T-SQL 语言的所有关键字,谓词和系统函数。变量名称及游标名称使用 Pascal 样式。
数据类型定义使用全部小写。
示例:DECLARE @LastName nvarchar(32) ;
2. 存储格式
尽量采用 Unicode 数据存储格式,提高可移植性和兼容性,实际应用中尽量使用 nchar、
nvarchar、ntext 代替 char、varchar、text。
3. 类型选择
如果字符具有明确的长度,使用 nchar 代替 nvarchar;char 代替 varchar。
在只有两个可能数值时,使用 bit 代替 int 或 smallint。
在 SQL Server 2005 中 , 使 用 nvarchar(MAX) 代 替 ntext ; varchar(MAX) 代 替 text ;
varbinary(MAX)代替 image。
在特殊的数据表结构中可考虑 xml 数据类型,达到事半工倍的效果。
4. 默认值
在建立数据表时,尽量使用默认值代替 NULL 值。比如设置 CreatedDate 列默认值为
GETDATE()。在可行的情况下设置字段为不允许空。
5. 字段长度
始终指定字符数据类型的长度,并确保允许用户可能需要的最大字符数,避免超出最大长度
时出现字符丢失现象。对于字符型数据,建议采用 2 的 n 次方来定义数据长度。
示例:nvarchar(32)
varchar(64)
6. 使用“'”
在 T-SQL 代码中为字符常量使用单引号,避免使用双引号。
7. 语句缩进
一个嵌套代码块中的语句使用 2 个空格的缩进。
8. 语句换行
建议 SQL 代码每行以关键字或“'”开头。
示例:
SELECT [ShiftID]
,[Name]
,[StartTime]
,[EndTime]
,[ModifiedDate]
FROM [AdventureWorks].[HumanResources].[Shift]
9. 语句分割
使用一个(而不是两个)空行分隔 T-SQL 代码的逻辑块。
10.使用“*”
尽量避免在任何代码中使用 “SELECT *”。
11.表名别名
表名别名要简短,但意义要尽量明确。通常使用大写的表名作为别名,使用 AS 关键字指
定表或字段的别名。
12.类型转换
不要依赖任何隐式的数据类型转换,不要假定 T-SQL 会进行必要的转换。例如,把数字变
量赋予字符值。相反,在为变量赋值或比较值之前,应使用适当的 CONVERT 函数使数据
类型相匹配。
13.数值比较
不要将空的变量值直接与比较运算符(符号)比较。如果变量可能为空,应使用 IS NULL
或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。
14.排序
决不要依赖 SELECT 语句会按任何特定顺序返回行,除非在 ORDER BY 子句中指定了顺
序。通常,应将 ORDER BY 子句与 SELECT 语句一起使用。可预知的顺序(即使不是最
方便的)比不可预知的顺序强,尤其是在开发或调试过程中。在返回行的顺序无关紧要的情
况下,可以忽略 ORDER BY ,减少资源开销。
字符串
在 Unicode 字符前面使用 N 前缀,避免引起数据的不一致。
示例:
-- Assumes the default code page is not Greek
CREATE TABLE #t1 (c1 nchar(1))
INSERT #t1 VALUES(N'Ω')
INSERT #t1 VALUES('Ω')
SELECT * FROM #t1
输出结果:
c1
----
Ω
O
16. BEGIN...END 块
在 SQL 代码快中尽量使用 BEGIN...END 语句块,提高代码可阅读性。
17. TOP 子句
尽量使用 TOP(变量)来减少 SQL 拼串现象。
18. TRANSACTION 编写
只要在例程中使用多个数据库修改语句,包括在一个循环中多次执行一个语句,就应考虑声
明显式事务。
实例:
BEGIN TRANSACTION Tran_1;
UPDATE [HumanResources].[Employee]
SET [Title] = @Title
,[HireDate] = @HireDate
,[CurrentFlag] = @CurrentFlag
WHERE [EmployeeID] = @EmployeeID;
IF @@ERROR > 0
BEGIN
ROLLBACK TRANSACTION Tran_1;
END
COMMIT TRANSACTION Tran_1;
19.存储过程
在编写存储过程时,使用 PROCEDURE 代替 PROC 简写。
示例:CREATE PROCEDURE [dbo].[存储过程名字]
五、 代码注释
1. 代码头部注释
在 SQL 代码块(sql 文件或存储过程)的头部进行注释,标注创建人(Author)、创始日期(Create
date)、修改信息(Modify [n])。
格式:
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- Modify [n]: < Modifier,Date, Description >
-- =============================================
示例:
-- ================================================
-- Author: Zhanghaifeng
-- Create date: 2006-12-25
-- Description: H2000 报关单回执处理
-- Modify [1]: 郑佐, 2006-12-31, 简化逻辑判断流程
-- Modify [2]: 郑佐, 2007-01-20, 更新条件判断
-- ================================================
注:日期格式使用 yyyy-MM-dd。Modify [n] n 代表修改序号,从 1 开始,每次修改加 1。
2. TRANSACTION 注释
建议在每个事务的开头进行注释,说明该事务的功能。
-- < Modifier,Date, Description >
BEGIN TRANSACTION Tran_1;