- 代码层次结构清楚,一行的最大长度一般不要87个字符,代码使用统一的风格,例如:如果使用空格作为缩进,则不能再使用TAB做缩进处理
- 脚本中的所有关键字、系统变量名、系统函数名全部大写
SELECT TOP 1 @TransactionNumber=TransactionNumber
FROM [SCM].[dbo].[potran01] WITH (NOLOCK)
WHERE purno='123456'
--变量的赋值必须注意用top 1
--引用对象时必须加对象所有者(一般都是dbo),不要写..
--如果purno是类型为字符型,必须加''
- 存储过程、视图、用户定义函数有合理的注释,至少包括:创建人、创建日期、修改人、修改日期、功能描述、参数说明. 注释必须写在 Go的后面
- 存储过程、视图、用户自定义函数中引用的对象如果在当前数据库中,对象不需要指定数据库名
- 不使用 SELECT * ,使用 SELECT <Field List>
- 如果一个T-SQL语句涉及到多个表,则引用的每个列都必须指定该列所属的对象, INNER Join连接操作,请将筛选条件与连接条件分离, 筛选条件放到Where字句中。
- 在INSERT语句中,必须指定插入列的列表, 否则的话, 表结构略有差异就会导致插入失败或者插入到不正确的列中
- 添加索引的时候,添加上WITH FILLFACTOR = 90 指定每页的填充程度,规定为90; 请显示指定Index的类型为NONCLUSTERED;请规范命名索引名,以免造成冲突,命名应该是“IX_表名_字段名”
- 在写子查询的时候,把最接近的表的条件放在等号的左边
- 禁止在使用了事务的情况下,不编写防止造成未提交或者未回滚事务的情况的处理代码,禁止在存储过程中输出不需要的信息. 避免使用SET XACT_ABORT ON 自动回滚事务,尽量使用TRY...CATCH语句
- 定义游标时,如果不是特别需要,使用LOCAL关键显式的将游标定义为局部游标,尽量避免使用全局(GLOBAL,这是数据库的默认行为)游标;没有特殊需要的话,尽量使用 FORWARD_ONLY READONLY 游标,同时尽量使用静态游标 STATIC;
避免大量数据的处理避免使用游标
- 缓存临时数据时,使用真正的临时表(#或者##开头)的表,避免将临时表缓存到正式表中.在创建临时表时,必须:
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
- 动态T-SQL处理语句中,如果涉及到变量,尽量使用sp_executesql,通过参数传递进行处理,避免使用EXEC硬拼SQL语句存储过程或函数中不允许包含未使用的参数或变量
- 能使用INNER JOIN实现的处理,不要使用外连接
- 数据本身不会重复,或者不需要防止重复的UNION,改用UNION ALL,因为UNION会自动进行distinct,order by的操作
- 使用IF语句时,如果满足条件和不满足条件都会做相应的处理,则不允许使用NOT做负向判断
- 使用 ISNULL(Col, 0) 代替 CASE WHEN Col IS NULL THEN 0 ELSE Col END
- 通过合理的方法避免在 SELECT 语句中使用 DISTINCT
- 删除整表数据时,建议使用 TRUNCATE TABLE
- 临时表和表变量都可以缓存中间数据,表变量适合缓存少量数据,它在内存中,效率比临时表高。大量数据应该使用临时表
- sql 2005中,ntext, text, and image 数据类型不再允许使用,请用nvarchar(max), varchar(max), and varbinary(max) 代替
- 涉及到xml处理时,使用sql server 2005 关于xml的处理方式
- SELECT TOP 1 ... ORDER BY与MAX,MIN
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
- 嵌套事务回滚