1、 http:/福州星网视易信息系统有限公司 MS SQL 脚本编码规范福州星网视易信息系统有限公司http:/福州星网视易信息系统有限公司 目录Transact-SQL 编程规范 .1一、 概述 .11. 基本原则 .12. 基本规范 .1二、 对象命名 .11. 数据库 .12. 数据库文件 .13. 数据表 .24. 数据视图 .25. 数据列 .26. 存储过程 .27. 函数 .38. 用户定义数据类型 .39. 主键、索引 .3三、 参数命名 .31. 数据列参数 .32. 非数据列参数 .43. 常用字段命名 .4四、 SQL 编写 .41. 大小写 .42. 存储格式 .43.
2、类型选择 .44. 默认值 .55. 字段长度 .56. 使用“” .57. 语句缩进 .58. 语句换行 .59. 语句分割 .510. 使用“*” .511. 表名别名 .512. 类型转换 .513. 数值比较 .614. 排序 .615. Unicode 字符串 .616. BEGIN.END 块 .617. TOP 子句 .618. TRANSACTION 编写 .619. 存储过程 .7五、 代码注释 .71. 代码头部注释 .72. TRANSACTION 注释 .7http:/福州星网视易信息系统有限公司 第 1 页 Transact-SQL 编程规范一、 概述本规范主要规定
3、SQL 脚本在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。1. 基本原则以大小写敏感编写 SQL 语句。尽量使用 Unicode 数据类型。优先使用连接代替子查询或嵌套查询。尽量使用参数化 SQL 查询代替语句拼接 SQL 查询。尽量使用存储过程代替 SQL 语句。禁止使用拼音+英语的方式来命名 SQL 对象或变量。禁止使用触发器。禁止在表间创建外键关系。禁止创建自增长主键列2. 基本规范采用 Pascal 样式命名数据库对象。大写 T-SQL 语言的所有
4、关键字,谓词和系统函数。Pascal 大小写 :组成标识符的每个单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求全部大写。例如:ApplicationExceptionID二、 对象命名1. 数据库命名格式为项目英文名称。示例:AdventureWorks2. 数据库文件数据文件:数据库名称 + _Data.mdf日志文件:数据库名称 + _Log.ldf示例:AdventureWorks_Data.mdfAdventureWorks_Log.ldfhttp:/福州星网视易信息系统有限公司 第 2 页 3. 数据表命名格式为 BL_TBL_+表名。示例:BL_TBL_Emp
5、loyee BL_TBL_Product表名以英文单数命名。示例:使用 BL_TBL_Product 而不是 BL_TBL_Products4. 数据视图命名格式为 BL_V_+ 视图名称。示例:BL_V_EmployeeBL_V_SalesPerson5. 数据列列名称命名采用英文单词或缩写,英文单词只来自于具体业务定义,尽量表达清楚含义。命名格式为列名称。示例:AddressIDPostalCode尽量避免使用拼音命名,如果不可避免,对于比较短的列名,采用拼音全写,如果拼音列名比较复杂,可以采用首个字用全拼,其它字用首字母大写表示。示例:宁波 Ningbo经营方式 JingYFS6. 存储
6、过程命名格式为 BL_HV_ +存储过程名称。示例:BL_HV_GetUserBL_HV_AddUser每个过程必须要有两个输出参数ErrorCode 和ErrorMessage。存储过程书写格式如下:if exists(select 1 from sysobjects where id=object_id(bl_hv_Checkout)drop procedure bl_hv_Checkoutgocreate procedure Checkout(.ErrorCode int output, -返回错误代码 0 表示成功 非 0 表示失败 ErrorMessage varchar(100)
7、output -返回错误信息)asdeclarecheckoutid int, -变量声明在此处 beginhttp:/福州星网视易信息系统有限公司 第 3 页 endgo7. 函数命名格式为 BL_Fn_ +函数名 。示例:BL_Fn_GetUser系统函数使用全部大写。示例:SELECT ISNULL(LastName,Unknown last name); GETDATE()8. 用户定义数据类型命名格式为自定义数据类型名称。示例:FlagNameStyle9. 主键、索引主键: PK_表名称_主键;如果是组合主键,使用 PK_表名 _主键 1_主键 2。示例:PK_ BL_TBL_St
8、ore_CustomerIDPK_ 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
9、三、 参数命名1. 数据列参数命名格式为 + 列名称。示例:EmployeeID在列名不符合 Pascal 样式时(早期遗留系统) ,例如使用全部大写的列名称,或使用“_”进行连接的字段名称,参数名称定义使用 + 列名称,这里的列名称尽量符合 Pascal 样式命名。http:/福州星网视易信息系统有限公司 第 4 页 2. 非数据列参数在参数无法跟列名称进行关联时,使用能够反映该参数功能的英文单词或单词组合, 采用Pascal 样式命名。示例:ErrorIDFlag3. 常用字段命名这里的常用字段是指在建表时频繁使用的表名或列名,下表对常用字段进行建议性定义, 列名称 数据类型 说明Crea
10、tedDate datetime 纪录创建日期,一般使用GETDATE()自动生成ModifiedDate datetime 纪录最后修改日期,首次使用 GETDATE()DeletedDate datetime 记录删除(标记删除)日期StartDate datetime 开始日期EndDate datetime 结束日期StartTime datetime 开始时间EndTime datetime 结束时间ID int 使用 ID 代替 Id 或 idParentID int 父 IDStatus int 状态四、 SQL 编写1. 大小写大写 T-SQL 语言的所有关键字,谓词和系统函数
11、。变量名称及游标名称使用 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;var
12、char(MAX) 代替text;varbinary(MAX)代替 image。在特殊的数据表结构中可考虑 xml 数据类型,达到事半工倍的效果。http:/福州星网视易信息系统有限公司 第 5 页 4. 默认值在建立数据表时,尽量使用默认值代替 NULL 值。比如设置 CreatedDate 列默认值为GETDATE()。在可行的情况下设置字段为不允许空。5. 字段长度始终指定字符数据类型的长度,并确保允许用户可能需要的最大字符数,避免超出最大长度时出现字符丢失现象。对于字符型数据,建议采用 2 的 n 次方来定义数据长度。示例:nvarchar(32)varchar(64)6. 使用“”在
13、 T-SQL 代码中为字符常量使用单引号, 避免使用双引号。7. 语句缩进一个嵌套代码块中的语句使用 2 个空格的缩进。8. 语句换行建议 SQL 代码每行以关键字或“”开头。示例:SELECT ShiftID,Name,StartTime,EndTime,ModifiedDateFROM AdventureWorks.HumanResources.Shift9. 语句分割使用一个(而不是两个)空行分隔 T-SQL 代码的逻辑块。10.使用“*”尽量避免在任何代码中使用 “SELECT *”。11.表名别名表名别名要简短,但意义要尽量明确。通常使用大写的表名作为别名,使用 AS 关键字指定表或
14、字段的别名。12.类型转换不要依赖任何隐式的数据类型转换,不要假定 T-SQL 会进行必要的转换。例如,把数字变量赋予字符值。相反,在为变量赋值或比较值之前,应使用适当的 CONVERT 函数使数据类型相匹配。http:/福州星网视易信息系统有限公司 第 6 页 13.数值比较不要将空的变量值直接与比较运算符(符号)比较。如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。14.排序决不要依赖 SELECT 语句会按任何特定顺序返回行,除非在 ORDER BY 子句中指定了顺序。通常,应将 ORDER BY 子句与 SELECT 语句一
15、起使用。可预知的顺序(即使不是最方便的)比不可预知的顺序强,尤其是在开发或调试过程中。在返回行的顺序无关紧要的情况下,可以忽略 ORDER BY ,减少资源开销。15. Unicode 字符串在 Unicode 字符前面使用 N 前缀,避免引起数据的不一致。示例:- Assumes the default code page is not GreekCREATE TABLE #t1 (c1 nchar(1)INSERT #t1 VALUES(N)INSERT #t1 VALUES()SELECT * FROM #t1输出结果:c1 - O16. BEGIN.END 块在 SQL 代码快中尽量使
16、用 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 0BEGINROLLBA
17、CK TRANSACTION Tran_1;ENDCOMMIT TRANSACTION Tran_1;http:/福州星网视易信息系统有限公司 第 7 页 19.存储过程在编写存储过程时,使用 PROCEDURE 代替 PROC 简写。示例:CREATE PROCEDURE dbo.存储过程名字五、 代码注释1. 代码头部注释在 SQL 代码块(sql 文件或存储过程)的头部进行注释,标注创建人(Author)、创始日期(Create date)、修改信息 (Modify n)。格式:- =- Author: - Create date: - Description: - Modify n: - =示例:- =- 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 注释建议在每个事务的开头进行注释,说明该事务的功能。- BEGIN TRANSACTION Tran_1;