你遵循什么SQL编码标准?

那里有没有广泛使用的SQL编码标准? SQL与C / C ++types的编程语言有些不同。 真的不知道如何最好地格式化它的可读性。

不会称之为编码标准 – 更像编码风格

SELECT T1.col1, T1.col2, T2.col3 FROM table1 T1 INNER JOIN ON Table2 T2 ON T1.ID = T2.ID WHERE T1.col1 = 'xxx' AND T2.Col3 = 'yyy' 
  • 大写保留字
  • 新行上的主要关键字
  • 在列之前无法使用逗号
  • 总是使用短的有意义的表别名
  • 与v的前缀视图
  • 前缀sp存储过程(但不要使用“sp_”保留内置的特效)
  • 不要前缀表
  • 表名单数

我喜欢前面的逗号:

 SELECT column1 , column2 , column3 , COALESCE(column4,'foo') column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1 , column2 

这使得它在我看来是最简单的阅读和debugging。

我知道这很长,但是忍耐着我,这很重要。 这个问题打开了一个很酷的蠕虫jar头。 如果你不喜欢数据库块,请继续阅读。

而且,在任何人想到敲我的回应之前,请看下面的文章和连接的文章关于locking,并重新编译; 两个最具破坏性的资源在SQL数据库上。

http://support.microsoft.com/kb/263889

我可以很快打字,而且我不喜欢再打下一个人。 但是,下面的几点我非常密切,即使是更多的打字。 这么多,我已经build立了我自己的SP应用程序来为我做。

我提出的观点非常重要! 你甚至可以对自己说,“你在开玩笑,这不是问题”,那么你没有阅读上面的文章。 而且,M $会把这些注意点放在注意点上,这完全是无稽之谈。 这些问题给我的应该是大胆和尖刻。

我还做了很多编码,使用C#应用程序构build我的基本脚本,以加快开发速度,这些实践非常合理(10年),使脚本SP更简单,尤其更快。

还有比这更多的,但这是我所做的一切的第一个60%。


最佳做法

  • 在对象周围使用括号,这样查询引擎在看到它的时候会明白地知道一个字段
  • 使用THE SAME CASE作为表对象名称和字段名称
  • 从应用程序调用SP时,使用具有正确所有者和大小写的完全限定的[dbo]。[procName]。 不开玩笑! 阅读上面的文章!
  • 引用对象的所有者,以便安全性明确知道,而不必弄清楚
  • 不要我们“sp_”,因为这是指系统存储过程和开销
  • 使用SET NOCOUNT ON和SET NOCOUNT OFF可消除额外开销,以便跟踪存储过程中有多lesslogging被更新,除非您需要它们。 通常情况下,你不这样做,你可以获得巨大的性能提升。

优先

  • 前缀存储过程与proc
  • 后缀SEL,UPD,DEL,INS(或SELECT,UPDATE,DELETE,INSERT)
  • 保留字大写
  • 新行上的主要关键字(脚本)
  • 在列(脚本)之前使用逗号
  • 用vw前缀视图
  • 不要在表格前加上
  • 表名单数
  • 为标准名称添加后缀,如“_ByPK”,“_OrderByLastName”或“_Top15Orders”

select

 CREATE PROC [dbo].[procTable_SEL] AS SET NOCOUNT ON SELECT [Column1] = T1.[col1] , [Column2] = T1.[col2] , [Column3] = T2.[col3] FROM [dbo].[Table] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO 

更新

 CREATE PROC [dbo].[procTable_UPD] AS SET NOCOUNT ON UPDATE t1 SET [Column1] = @Value1 , [Column2] = @Value2 , [Column3] = @Value3 FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO 

 CREATE PROC [dbo].[procTable_INS] AS SET NOCOUNT ON INSERT INTO [Table1] ( [Column1] , [Column2] , [Column3] ) VALUES ( @Value1 , @Value2 , @Value3 ) SET NOCOUNT OFF GO 

要么

 CREATE PROC dbo.procTable_INS AS SET NOCOUNT ON INSERT INTO [table1] ( [Column1] , [Column2] , [Column3] ) SELECT [Column1] = T1.col1 , [Column2] = T1.col2 , [Column3] = T2.col3 FROM dbo.Table1 T1 INNER JOIN ON Table2 T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO 

删除

 CREATE PROC dbo.procTable_DEL AS SET NOCOUNT ON DELETE FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO 

如果你是谷歌,那里有很多的编码标准。 例如,

数据库编码标准和指南

SQL SERVER数据库编码标准和指南完整列表

从PostgreSQL的一个非常好的博客,但这个主题是适用于一般:

可维护的查询 – 我的观点(depesz.com)

…我决定,我的优先级编写可维护的查询:

  1. 避免无用的打字。

  2. 使用表/视图的别名。 总是。 并让他们明智的别名。

  3. 以某种方式缩进代码。

  4. 避免引用(是的,这就是为什么我讨厌Django)

  5. 使用连接语法

我同意大写的保留字和除了我自己以外的其他标识符。

我个人不喜欢用sp_前缀一个存储过程名称 – 它是多余的,IMO。 相反,我喜欢用“function单元”标识符作为它们的前缀。 例如,我将调用sprocs来处理订单order_Save,order_GetById,order_GetByCustomer等等。它使它们在逻辑上被分组在pipe理工作室中,并且使得更难以select错误的一个。 (GetOrderByProduct,GetCustomerById等…)

当然,这是个人偏好,其他人可能更喜欢把所有的Sprocs,所有的保存等等。

只是我的2C。

谷歌的SQL漂亮的打印机或看看这里 。 我没有尝试过,但是它给了你一个很好的开始。 大多数商业工具,如蟾蜍有一个“格式化”选项,这也有帮助。

我感到惊讶的是,我用了近20年的编码风格不在这个列表中:

  SELECT column1, column2, column3, COALESCE(column4, 'foo') AS column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1, column2 

我觉得这绝对是最可读的,但是我承认打字很繁琐。 如果alignment关键字太多,我会select左alignment它们:

 SELECT column1, column2, column3, COALESCE(column4, 'foo') AS column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1, column2 

我通常每行很less,即:

 select col1, col2, col3 from some_table tabl1 where col1 = 'some' and ( col2 = 'condition' or col2 = 'other' ) 

和www.sqlinform.com一起玩 – 我推荐使用ANSI-92标准 ,然后再用这个网站。

 SELECT c.id , c.name , c.folder , cs.num_users active_members , cs.num_videos FROM campaign c JOIN campaign_stats cs ON cs.campaign_id = c.id JOIN (SELECT _c.id , _c.name FROM campaign _c WHERE _c.type = 9) t_c ON t_c.id = c.id WHERE c.id IN (1,2,3) AND cs.num_videos > 10 

这对我们来说很好。

这个实际的查询没有多大意义,因为我试图快速构build它作为一个例子…但这不是重点。

  • t_c代表分类表子查询或“temp category”。
  • 在子查询中填写内容。
  • 别名列名在查询的上下文中有意义。 例如“active_members”
  • 在新行的开头添加逗号使得构builddynamic查询变得更容易:

     $sql .= ", c.another_column" 
  • 一切都很简单。

蓝色的任何东西都是大写的SELECTDELETEGO

表格名称与客户表格一样都是单一的

链接表是tablename_to_tablename

在表名和参数的作品之间使用_

 BEGIN SELECT Company.ID AS Company_ID, Company.Client_Name, Company.Website, Office.Office_Name FROM Company_Office WITH(NOLOCK) INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID WHERE END 

要使用的数据types:我们应该只使用以下数据types:

  • INT
  • BIGINT
  • SMALLINT
  • VARCHAR
  • BIT
  • 约会时间

为BIT数据types提供默认值。 它不应该是可空的表和列名称不应该是小写。 它应该描述它的目的。 避免使用简短的表格。 在创build表FK和PK的时候要仔细考虑和定义。 variables名称应以一个/两个字母开头,以小写字母表示其数据types。 例如INTvariables应该从i开始。 名字应该是描述性的,应该避免使用简短的forms。 每个单词应该以大写字母开头,后面跟着所有的小写字母。

例如

正确的方法: – iTotalCount

不正确的方法: – xyz

在存储过程中使用“WHERE”子句的表列应该被索引/键入。 这将增加数据处理的速度。 WHERE子句中的参数sorting应该正确完成。 主键/索引应位于位variables之前。 例如: – 在列的组合上创build索引(REF_ID,T_TYPE_STR,CNUMBER,TLOG_ID)

– 在'WHERE'子句中顺序使用索引键的正确方法

 SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID FROM T_T_DATA_tbl WHERE REF_ID = 1 AND LOG_ID = '4042654' AND T_TYPE_STR = 'SA' AND CNUMBER = '10702' –Incorrect way SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID FROM T_T_DATA_tbl WHERE LOG_ID = '4042654' AND T_TYPE_STR = 'SA' 

在编写一个存储过程的时候,我们应该在开始部分有描述部分,其中包含Author:

创builddate:

描述:

如果有任何sp被修改,这部分应该附加

修改者:

修改于:

描述:

ROW_INSERTION_DATE_TIME和ROW_UPDATION_DATE_TIME列应具有缺省值作为GETDATE()。

更多: http : //www.writeulearn.com/sql-database-coding-standards/

 create table #tempTable ( col1 int, col2 int, col3 int ) insert into #tempTable ( col1, col2, col3 ) select col1, col2, col3 from Table3 inner join Table2 on Table1.col1 = Table2.col2 where col1 = 5 select col2, case when col1 = 3 then 'something' else 'somethingelse' end from #tempTable where col1 = 5 and ( col2 = 5 or col3 in ( select field from Table2 where somecol = 2 and othercol = 5 ) )