1、准则目的
使公司内部的 SQL 语法统一规范;
便于项目团队相关人员的查看、修改;
提高存储过程执行效率,避免 SQL 语法错误导致服务器效率低而产生系统问题;
2、书写注释规范
2.1 签名、日期、用途
说明:每个存储过程必须要标明存储过程的编写者、编写日期、用途。
示例:
-- =============================================
-- Author:
-- Create date: <2022.8.13>
-- Description:
-- Rev: 10.00 同时汇总各需求项的是否完成装配的状态
-- =============================================
2.2 局部变量的注释说明
说明:创建局部变量时,请标明变量的用途。
示例:
declare @IsMOItem char(1) --装配参照清单类型,1-参照工单进行装配,0-参照BOM进行装配
2.3 表变量、临时表的字段说明
说明:创建表变量或临时表时,请标明表、字段的用途。
2.4 段落缩进注释
说明:注释每一段代码的作用,便于查阅理解代码含义。
DECLARE table_cur CURSOR FOR
SELECT LineSequence,IsStartLot from @AssyBOMItem
FETCH NEXT FROM table_cur INTO @LineSequence,@IsStartLot
update @AssyBOMItem set IsDelete=1
where LineSequence like @LineSequence+'%'
if exists(select LineSequence from @AssyBOMItem where LineSequence
update @AssyBOMItem set IsDelete=1
where LineSequence=@LineSequence
FETCH NEXT FROM table_cur INTO @LineSequence,@IsStartLot
3、SQL 影响执行效率的注意点
select * from table1 where field1<=10000 and field1>=0;
select * from table1 where field1>=0 and field1<=10000;
如果数据表中的数据 field1 都>=0,则第一条 select 语句要比第二条 select
语句效率高的多,因为第二条 select 语句的第一个条件耗费了大量的系统资源。
原则:在 where 子句中应把最具限制性的条件放在最前面。
select * from tab where a=...and b=...and c=...;
若有索引 index(a,b,c),则 where 子句中字段的顺序应和索引中字段顺序一致。
原则:where 子句中字段的顺序应和索引中字段顺序一致。
以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。
select field3,field4 from tb where field1='sdf' 快
select * from tb where field1='sdf' 慢
select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,
严格禁止使用函数!两万条记录以下没有限制。例如:Subtring、Like、Datepart
select field3,field4 from tb where field2!='TOM'不使用索引。
条件中尽量不用!=, Not in, Like, OR, NOT EXISTS 的条件语句。
select field3,field4 from tb where field2 is not null 不使用索引。
空值不在索引中存储,所以上面语句执行不会使用索引检索。

3.2 避免多表关联
1. 对单条记录检索时,请对 SQL 语句进行拆分,减少表关联。
Lot ON MO.MOId = Lot.MOId
WHERE (MO.MOName = 'S20100408001-900G')
WHERE (MOName = 'S20100408001-900G')
2. 利用表变量来替换大表关联,表变量的作用域为一个批处理,批处理完了,表变量也会
随之失效,比起临时表有它独特的优点:不用手动去删除表变量以释放内存。
select cardNo from member where in('a-01',代理号二)
3.3 临时表和表变量的灵活使用
1. 避免重编译:表标量可以避免临时表引起的重编译。
2. 没有事务日志开销:表变量不执行事务日志活动,临时表执行该活动。
3. 没有锁开销:表变量被看作局部变量,不错在临时表的锁开销。
4. 没有回滚开销:没有事务日志就不存在回滚事务。
1. 临时表空间一般利用虚拟内存,大大减少了硬盘的 I/O 次数,因此也提高了系统效率。
2. 事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
3. 数据当前会话期可见,其它的会话只能看到其结构,只能看到自己的数据,各会话的
3.5 防范死锁问题
1.一定要在 Delete 前加上 If Existed(select XID from youtable where 删除的条件), 判
If Exists(select LotId from Lot where LotSN = 'FG00000012')
Delete Lot where LotSN = 'FG00000012'
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED –允许脏读
3. 客户化程序在 ADO.NET 编写时,数据库操作完成后,一定需要释放 connection 连
接对象,不要用全局的 connection 对象不释放。
3.6 游标的谨慎使用
(1) 尽管使用游标比较灵活,可以实现对数据集中单行数据的直接操作,但游标会在下
明确指出游标的用途:for read only 或 for update,在 for update 后指定被修改
declare mycursor cursor for select * from yuangong
declare mycursor cursor for select * from yuangong for read only
declare mycursor cursor for select * from yuangong for udpate of 列名