失效链接处理 |
SQL SERVER数据库脚本开发规范 PDF 下载
本站整理下载:
提取码:ph4o
相关截图:
![]()
主要内容:
一、命名规范
1)命名标志法
用Pascal标志法,给数据库对象命名,Tables,Views,Store Procedures。表和视图建议用“s”结尾。例如:
Contracts;
ContactPhones
2)一组相关表的命名
如果有一组相关的表,需要加前缀。以下划线“_”分割。例如:
Products_USA
Products_India
Products_Mexico
3)存储过程命名
UP[_ApplicationName]_[GroupName_]<Action><TableName>。
这里的Action如:Get,Delete,Update,Write,Archive,Erase等动词。
例如:
UP_Clop_GetStockProcess;
UP_GetOrgUsers
4)触发器命名
TR_<TableName>_<Action><Description>
例如:
TR_UserDetails_UpdateUserName。
5)索引命名
IX_<TableName>_<Columns Separated By_>。例如:
IX_UserDetails_UserID。
6)主键
PK_<TableName>。
7)外键
FK_<TableName1>_<TableName2>。例如:
FK_UserDetails_Emails。
8)引用字段命名
一个表如有引用字段,指有外键的列,该字段名格式为:<ReferedTableName>ID;
9)缺省值
DF_<TableName>_<Column Name>。例如:
DF_UserDetails_UserName。
10)避免使用空格
在数据库对象命名时,避免使用空格。
11)数据库保留字
不要使用数据库保留字,给数据对象命名;
二、书写格式
1)SELECT语句
不要在SELECT语句后面用星号*,表名前需要加Owner(dbo)。在SELECT语句后面写明需要的列名。例如:
SELECT MainDeptId
,PowerDesc
FROM [dbo].[AppDatabases] WITH(NOLOCK)
2)数据库对象引用
在多表关联时,列名前需要加上别名(或表名),表名前加Owner(dbo)。如果涉及到跨数据库,就需要加上Database名称。例如:
例如:AdventureWorks.dbo.Contact;存储过程也一样;
3)不要拼SQL语句
从安全角度出发,尽可能用参数化来实现;
4)明确写出关联方式(不要用旧的书写方式)
--错误的格式:
SELECT *
FROM Table1, Table2
WHERE Table1.d = Table2.c
--正确的格式:
SELECT Tb1.Columns1
,Tb2.Columns2
FROM Table1 Tb1 WITH(NOLOCK)
INNER JOIN Table2 Tb2 WITH(NOLOCK)
ON Tb1.d = Tb2.c
5)SQL语句缩进方式
SQL语句要按照缩进方式书写。提高可读性。例如:
Example:Wrong Format
SELECT E.UserName,UD.PasswordEncode FROM DBO.UserDetails UD WITH(NOLOCK) INNER JOIN Employee E WITH(NOLOCK) ON E.EmployID = UD.UserID
Example:Correct Format
SELECT E.UserName
,UD.PasswordEncode
FROM DBO.UserDetails UD WITH(NOLOCK)
INNER JOIN Employee E WITH(NOLOCK)
ON UD.UserID = E.EmployID
6)SQL保留字要大写
对SQL的保留字,都需要大写。例如:
SELECT,UPDATE,INSERT,WHERE,INNER JOIN,AND,OR等。
7)不使用系统前缀
不要用系统对象使用了的前缀来命名。例如“sp_”是数据库系统自身存储过程的前缀(请参存储过程的命名格式);
8)注释的重要性
不要忘记在存储过程,触发器,SQL Batches中添加注释。注释不会影响性能。
9)注释的格式
单行注释,用两个减号(--)。多好注释,用(/* */)括起来;
10)过多使用GOTO语句会使得代码可读性降低
三、性能相关
1)尽量用主键
在Update和Delete的Where子句中,尽量用主键
2)Where子句中的条件按照精度从高到底依次排列
SELECT P.Description
,P.Model
From Products P WITH(NOLOCK)
Where Brand = 'Panasonic'
AND Category = 'HomeAplliance'
Wrong Format:
SELECT P.Name
,P.Age
FROM PersonTable P WITH(NOLOCK)
WHERE CountryID = ‘CN’
AND ProvinceID = ‘HeBei’
AND CityID = ‘ShiJiaZhuang’
3)尽量避免使用游标Cursors
建议使用SELECT语句,或用While Loop语句实现相同功能;
4)SET NOCOUNT ON 语句
把 SET NOCOUNT ON 语句放到存储过程和触发器中,作为第一句执行语句。例如:
CREATE PROCEDURE [dbo].[UP_GetOrgChildren]
AS
BEGIN
SET NOCOUNT ON
......
关闭数据库提示输出。
5)模糊查询Like语句
在模糊查询Like语句中,不要使用前置通配。即不要在单词的第一个字母使用百分号%。这样Index不再起作用;
6)不要在Where子句关联字段上使用函数
这会使得Index不起作用;
7)Filtered Index可以提高查询性能
当特定集合经常被访问,使用Filtered Index可以提高查询性能,可以减少索引维护开销;
8)尽量不用临时表
建议使用派生表或公用表表达式(CTE)
--查找排在第二位的价格
SELECT Min(UnitPrice)
FROM Products With(Nolock)
WHERE ProductID IN
(
SELECT TOP 2 ProductID
FROM Products With(Nolock)
ORDER BY UnitPrice DESC
)
实现同样功能,可以改造成以下用派生表来表达。效率是上面的两倍:
SELECT Min(UnitPrice)
FROM
(
SELECT TOP 2 UnitPrice
FROM Products With(Nolock)
ORDER BY UnitPrice DESC
) As Pro
9)尽可能不用“不等于号”
10)及时检查global变量@@ERROR
在执行数据处理(INSERT/UPDATE/DELETE)后,及时检查global变量@@ERROR。以便在出错时,能Rollback。或者用Try Catch;
11)不要使用RECOMPLIE选项
不要在调用存储过程时,使用RECOMPLIE选项
EXECUTE dbo.UP_Test_Defaults @p2 = 'A' WITH RECOMPILE;
12)Declare语句
在存储过程的起始部分定义Declare语句。这会使查询优化器,Reuse查询计划;
13)SET语句
在存储过程前面(Declare后面),执行SET语句,对变量进行初始化;
14)尽可能不使用Cross Join
15)尽可能不使用集合返回
如果在没有必要返回集合的情况下,不要使用集合返回。
例如:
IF EXISTS(SELECT Top 1 1
FROM dbo.UserDetails WITH(NOLOCK)
WHERE UserID = 50),这样比下面写法好:
IF EXISTS(SELECT *
FROM dbo.UserDetails WITH(NOLOCK)
WHERE UserID = 50)
|