一些SQL 脚本规范

  1. 代码层次结构清楚,一行的最大长度一般不要87个字符,代码使用统一的风格,例如:如果使用空格作为缩进,则不能再使用TAB做缩进处理
  2. 脚本中的所有关键字、系统变量名、系统函数名全部大写

SELECT TOP 1 @TransactionNumber=TransactionNumber

FROM [SCM].[dbo].[potran01] WITH (NOLOCK) 

WHERE purno='123456'

 --变量的赋值必须注意用top 1

--引用对象时必须加对象所有者(一般都是dbo,不要写..

--如果purno是类型为字符型,必须加''

 

  1. 存储过程、视图、用户定义函数有合理的注释,至少包括:创建人、创建日期、修改人、修改日期、功能描述、参数说明. 注释必须写在 Go的后面
  2. 存储过程、视图、用户自定义函数中引用的对象如果在当前数据库中,对象不需要指定数据库名
  3. 不使用 SELECT * ,使用 SELECT <Field List>
  4. 如果一个T-SQL语句涉及到多个表,则引用的每个列都必须指定该列所属的对象, INNER Join连接操作,请将筛选条件与连接条件分离, 筛选条件放到Where字句中。
  5. INSERT语句中,必须指定插入列的列表, 否则的话, 表结构略有差异就会导致插入失败或者插入到不正确的列中
  6. 添加索引的时候,添加上WITH FILLFACTOR = 90 指定每页的填充程度,规定为90; 请显示指定Index的类型为NONCLUSTERED;请规范命名索引名,以免造成冲突,命名应该是“IX_表名_字段名”
  7. 在写子查询的时候,把最接近的表的条件放在等号的左边
  8. 禁止在使用了事务的情况下,不编写防止造成未提交或者未回滚事务的情况的处理代码,禁止在存储过程中输出不需要的信息. 避免使用SET XACT_ABORT ON 自动回滚事务,尽量使用TRY...CATCH语句
  9. 定义游标时,如果不是特别需要,使用LOCAL关键显式的将游标定义为局部游标,尽量避免使用全局(GLOBAL,这是数据库的默认行为)游标;没有特殊需要的话,尽量使用 FORWARD_ONLY READONLY 游标,同时尽量使用静态游标  STATIC

避免大量数据的处理避免使用游标

 

  1. 缓存临时数据时,使用真正的临时表(#或者##开头)的表,避免将临时表缓存到正式表中.在创建临时表时,必须:

IF OBJECT_ID(N'tempdb.dbo.##TEMP_NESO_FP_BadSOList_FOR_V1_V2', N'U') IS NOT NULL

                                DROP TABLE ##TEMP_NESO_FP_BadSOList_FOR_V1_V2

CREATE TABLE ##TEMP_NESO_FP_BadSOList_FOR_V1_V2()

 

结束后记得DROP TABLE ##TEMP_NESO_FP_BadSOList_FOR_V1_V2

 

  1. 动态T-SQL处理语句中,如果涉及到变量,尽量使用sp_executesql,通过参数传递进行处理,避免使用EXEC硬拼SQL语句存储过程或函数中不允许包含未使用的参数或变量

 

  1. 能使用INNER JOIN实现的处理,不要使用外连接

 

  1. 数据本身不会重复,或者不需要防止重复的UNION,改用UNION ALL,因为UNION会自动进行distinct,order by的操作

 

  1. 使用IF语句时,如果满足条件和不满足条件都会做相应的处理,则不允许使用NOT做负向判断

 

  1. 使用 ISNULL(Col, 0) 代替 CASE WHEN Col IS NULL THEN 0 ELSE Col END

 

  1. 通过合理的方法避免在 SELECT 语句中使用 DISTINCT

 

  1. 删除整表数据时,建议使用 TRUNCATE TABLE

 

  1. 临时表和表变量都可以缓存中间数据,表变量适合缓存少量数据,它在内存中,效率比临时表高。大量数据应该使用临时表

 

  1. sql 2005中,ntext, text, and image 数据类型不再允许使用,请用nvarchar(max), varchar(max), and varbinary(max) 代替

 

  1. 涉及到xml处理时,使用sql server 2005 关于xml的处理方式

 

  1. SELECT TOP 1 ... ORDER BYMAXMIN

 

SELECT TOP 1 item

FROM [SCM].[dbo].[potran01] WITH (NOLOCK)

ORDER BY item DESC

 

--建议使用MAX函数。

SELECT MAX(item)

FROM [SCM].[dbo].[potran01] WITH (NOLOCK)

IF (SELECT COUNT(*)

                FROM [SCM].[dbo].[VendorReturnPolicy] WITH (NOLOCK)

                WHERE VendorNumber='20001') >0     

BEGIN     

    SELECT VendorCreditDays,VRPNumber

                FROM dbo.VendorReturnPolicy WITH (NOLOCK)

                WHERE VRPNumber = 3279       

END

 

--修改为:

IF EXISTS(SELECT TOP 1 1

                                FROM [SCM].[dbo].[VendorReturnPolicy] WITH (NOLOCK)

                                WHERE VendorNumber='20001')

BEGIN     

    SELECT VendorCreditDays,VRPNumber

                FROM dbo.VendorReturnPolicy WITH (NOLOCK)

                WHERE VRPNumber = 3279       

END

 

 

 

  1. 嵌套事务回滚

             

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值