T-SQL 编码标准

T-SQL 编码标

布日期: 4/15/2005 | 更新日期: 4/15/2005

Brian Walker

可能得很奇怪,但好像的确没有什正式的”T-SQL 编码标准。早在 1999 年末的候,我惊喜地发现 John Hindmarsh 提出的 SQL Server 7.0 准,我在 2000 2 月的社他的某些建议进行了总结。(2000 2 月以及本月的中都包括了 John 原来的准。)后来,Ron Talmage 撰写了一系列专栏文章,提出了他最佳方法的建,当然,SQL Server 也已正式布了 SQL Server 最佳方法分析器 (SQLBPA)在,一位具有超 25 经验的数据管理用程序开发员 Brian Walker 又提出了他的建和提示。

T-SQL 常会忽略编码标准,但准却是开发组顺展工作的关键工具。里介编码标准是我多年的开发成果。它当然没有得到普遍接受,而且不可否,有些有主色彩。我的目的实际上更多的是了提高大家的意,而不是吹捧自己是 T-SQL 式方面的仲裁者:最重要的是要建立某些合理的编码标准并遵循准。您在篇文章中会发现 T-SQL 程的一系列不同的编码标准、技巧和提示。它并未以任何特定的或重要性序列出。

从格式始。表面上,T-SQL 的格式似乎并不重要,但一致的格式可以使您的同事(不是同一小的成员还是更大范 T-SQL 开发团队的成)更松地浏览和理解您的代T-SQL 句有一个构,遵循一目了然的构使您可以更松地找和确认语句的不同部分。一的格式使您可以更松地在复杂 T-SQL 句中增段,使调试工作得更容易。下面是 SELECT 句的格式示例:

       SELECT C.Name

, E.NameLast

, E.NameFirst

, E.Number

, ISNULL(I.Description,'NA') AS Description

FROM tblCompany AS C

JOIN tblEmployee AS E

ON C.CompanyID = E.CompanyID

LEFT JOIN tblCoverage AS V

ON E.EmployeeID = V.EmployeeID

LEFT JOIN tblInsurance AS I

ON V.InsuranceID = I.InsuranceID

WHERE C.Name LIKE @Name

AND V.CreateDate > CONVERT(smalldatetime,

          ' 01/01/2000 ')

ORDER BY C.Name

, E.NameLast

, E.NameFirst

, E.Number

, ISNULL(I.Description,'NA')

 

SELECT @Retain = @@ERROR, @Rows = @@ROWCOUNT

 

IF @Status = 0 SET @Status = @Retain

一个嵌套代码块中的句使用四个空格的缩进(上述代中的多行 SELECT 句是一个 SQL 句。)在同一句中始新行,使 SQL 关键字右对齐。将代码编辑器配置使用空格,而不是使用制表符。这样,不管使用何程序看代,格式都是一致的。

大写所有的 T-SQL 关键字,包括 T-SQL 函数。量名称及光名称使用混和大小写。数据型使用小写

表名名要短,但意要尽量明确。通常,使用大写的表名作为别名,使用 AS 关键字指定表或字段的

当一个 T-SQL 句中及到多个表,始使用表名名来限定字段名。使其他人阅读起来更清楚,避免了含模糊的引用

当相数字出连续的代行中(例如一系列 SUBSTRING 函数用),将它排成列。这样容易浏览数字列表

使用一个(而不是两个)空行分隔 T-SQL 逻辑块,只要需要就可以使用

声明 T-SQL 局部量(例如 @lngTableID,使用适当的数据型声明和一致的大写

指定字符数据型的度,并确保允可能需要的最大字符数,因超出最大度的字符会失。

指定十制数据型的精度和范,否,将默认为未指定精度和整数范

使用错误处理程序,但要住行首 (BOL) 中的错误检查示例不会象介的那起作用。用来检查 @@ERROR 函数的 T-SQL (IF) 实际上在程中清除了 @@ERROR ,无法再捕除零之外的任何。(即使示例起作用,它也只能捕最后生的一个错误,而不是您更想捕的第一个错误。)必使用 SET SELECT 立即捕获错误,如前面示例所示。如果状态变量仍然零,应转换到状态变量。

避免使用未声明的功能,例如系表中未声明的列、T-SQL 句中未声明的功能或者未声明的系储过程或展的存储过程。

不要任何式的数据转换。例如,不能数字予字符,而假定 T-SQL 行必要的转换。相反,在为变赋值或比较值之前,使用适当的 CONVERT 函数使数据型相匹配。另一个示例: T-SQL 会在行比之前字符表达式式且自 RTRIM,但不能依此行,因兼容性级别设置非字符表达式会使情况复杂化。

不要将空的直接与比运算符(符号)比。如果量可能空,使用 IS NULL IS NOT NULL 行比,或者使用 ISNULL 函数。

不要使用 STR 函数行舍入,此函数只能用于整数。如果需要十的字符串形式,先使用 CONVERT 函数(至不同的范)或 ROUND 函数,然后将其转换为字符串。也可以使用 CEILING FLOOR 函数。

使用数学公式要小心,因 T-SQL 可能会将表达式制理解一个不需要的数据型。如果需要十果,在整数常量后加点和零 (.0)

决不要依 SELECT 句会按任何特定序返回行,除非在 ORDER BY 子句中指定了

通常, ORDER BY 子句与 SELECT 句一起使用。可知的序(即使不是最方便的)比不可知的,尤其是在开发调试过程中。(部署到生产环境中之前,可能需要 ORDER BY 子句。)在返回行的序无关紧要的情况下,可以忽略 ORDER BY 开销

不要在 T-SQL 中使用双引号。应为字符常量使用引号。如果没有必要限定象名称,可以使用(非 ANSI SQL 准)括号将名称括起来

SQL Server 2000 中,尽量使用表量来代替临时表。如果表量包含大量数据,注意索引非常有限(只有主索引)

先在例程中临时表,最后再临时表。将 DDL DML 句混合使用有助于外的重新编译

认识临时并不是不可使用,适当地使用它可以使某些例程更有效,例如,当需要重引用大型表或常用表中的某个数据集。但是,于一次性事件,最好使用出表。

使用表 UDF 要小心,因量(而不是常量)中传递某个参数,如果在 WHERE 子句中使用参数,会致表描。要避免在一个查询中多次使用相同的表 UDF。但是,表 UDF 具有某些非常方便的动态编译功能。[关资料:参 Tom Moreau 2003 11 月份生成序列号专栏中的使用 UDF 填充表。-者按]

几乎所有的存储过程都时设 SET NOCOUNT ON,而在时设 SET NOCOUNT OFF[SET NOCOUNT ON 使 SQL Server 无需在行存储过程的句后向客 DONE_IN_PROC 消息。- 者按] 准同适用于触器。

只要在例程中使用多个数据修改句,包括在一个循中多次行一个句,就声明式事

使用基于光的方法或临时表方法之前,找基于集的解决方案来解决问题。基于集的方法通常更有效

临时表一,光并不是不可使用。小型数据集使用 FAST_FORWARD 通常要于其他逐行理方法,尤其是在必引用几个表才能得所需的数据。在果集中包括的例程通常要比使用光标执行的速度快。如果开发时间,基于光的方法和基于集的方法都可以尝试一下,看哪一方法的效果更好。

使用包含序号(从 1 N)的表很方便。

理解 CROSS JOIN 的工作原理并加以利用。例如,您可以在工作数据表和序号表之有效地使用 CROSS JOIN果集中将包含个工作数据与序号合的记录

我的是:T-SQL 往往很简洁,因此如果某个代码块看起来很难处理或重内容多,那可能存在一简单,更好的方法。

结论

如果您我的建有任何看法,迎随向我讨论,也可以就其他问题提出您的建。我希望您将此作为谈话开场白。

其他信息:摘自 Karen 2000 2 月份的社

开发的前沿地上,有一股以 SQL Server 数据管理 John Hindmarsh 首的独立的新生力量。MCTMCSE MCDBA 都是最得您花时间去研究的。John 献是撰写了一份详细的白皮,概述了他 SQL Server 关标准提出的建。我所知道的其他唯一提出似建的文章是 Andrew Zanevsky 的《Transact-SQL Programming(ISBN 1-56592-401-0) 中的“Format and Style”一章。AndrewSQL Server Professional 的投稿人 Tom Moreau Paul Munkenbeck 以及 John 的朋友兼同事 Stephen James John 的白皮做出过贡献。下面是 John 为编写存储过程提供的建示例:

使用 SQL-92 接句法。

了提高性能,应优先使用接,然后使用子查询或嵌套查询

确保量和参数的型和大小与表数据列相匹配。

确保使用所有量和参数,或者全部除。

尽可能将临时对象放置在本地。

只使用在存储过程中建的临时表。

检查输入参数的有效性。

先使用 SELECT...INTO,然后使用 INSERT...SELECT,以避免大量死

维护工作需要的逻辑单元;在可以短的情况下,不要建大量或长时间运行的程。

不要在任何代中使用 SELECT *

程中使用缩进、制表符和空格(参示例脚本)。

T-SQL 句要大写。

程中添加大量注,确保可以识别进程。在有助于澄清步骤的地方使用行注

包括事管理,除非要从 MTS 程中程。( MTS 写独立的程。

监视 @@TRANCOUNT 以确定事级别

避免使用 GOTO错误处理程序中除外。

避免使用嵌套程。

避免式解析象名称,确保所有象都 dbo 所有。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值