[转] SQL编码规范(收集) & 数据库设计经验谈(转)
原文转自:
数据库设计经验谈(转)
SQL编码规范(收集) http://hi.baidu.com/rambochow/blog/item/3ebcbb3db3758903bba16743.html
1.书写格式
1.书写格式
示例代码:
存储过程SQL文书写格式例
select
c.dealerCode,
round(sum(c.submitSubletAmountDLR + c.submitPartsAmountDLR + c.submitLaborAmountDLR) / count(*), 2) as avg,
decode(null, 'x', 'xx', 'CNY')
from (
select
a.dealerCode,
a.submitSubletAmountDLR,
a.submitPartsAmountDLR,
a.submitLaborAmountDLR
from SRV_TWC_F a
where (to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)'
and to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') <= 'Date Range(end)'
and nvl(a.deleteflag, '0') <> '1')
union all
select
b.dealerCode,
b.submitSubletAmountDLR,
b.submitPartsAmountDLR,
b.submitLaborAmountDLR
from SRV_TWCHistory_F b
where (to_char(b.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)'
and to_char(b.ORIGSUBMITTIME,'yyyy/mm/dd') <= 'Date Range(end)'
and nvl(b.deleteflag,'0') <> '1')
) c
group by c.dealerCode
order by avg desc;
C#中里的SQL字符串书写格式例
strSQL = "insert into Snd_FinanceHistory_Tb "
+ "(DEALERCODE, "
+ "REQUESTSEQUECE, "
+ "HANDLETIME, "
+ "JOBFLAG, "
+ "FRAMENO, "
+ "INMONEY, "
+ "REMAINMONEY, "
+ "DELETEFLAG, "
+ "UPDATECOUNT, "
+ "CREUSER, "
+ "CREDATE, "
+ "HONORCHECKNO, "
+ "SEQ) "
+ "values ('" + draftInputDetail.dealerCode + "', "
+ "'" + draftInputDetail.requestsequece + "', "
+ "sysdate, "
+ "'07', "
+ "'" + frameNO + "', "
+ requestMoney + ", "
+ remainMoney + ", "
+ "'0', "
+ "0, "
+ "'" + draftStruct.employeeCode + "', "
+ "sysdate, "
+ "'" + draftInputDetail.honorCheckNo + "', "
+ index + ")";
1).缩进
对于存储过程文件,缩进为8个空格
对于C#里的SQL字符串,不可有缩进,即每一行字符串不可以空格开头
2).换行
1>.Select/From/Where/Order by/Group by等子句必须另其一行写
2>.Select子句内容如果只有一项,与Select同行写
3>.Select子句内容如果多于一项,每一项单独占一行,在对应Select的基础上向右缩进8个空格(C#无缩进)
4>.From子句内容如果只有一项,与From同行写
5>.From子句内容如果多于一项,每一项单独占一行,在对应From的基础上向右缩进8个空格(C#无缩进)
6>.Where子句的条件如果有多项,每一个条件占一行,以AND开头,且无缩进
7>.(Update)Set子句内容每一项单独占一行,无缩进
8>.Insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进
9>.SQL文中间不允许出现空行
10>.C#里单引号必须跟所属的SQL子句处在同一行,连接符("+")必须在行首
3).空格
1>.SQL内算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔
2>.逗号之后必须接一个空格
3>.关键字、保留字和左括号之间必须有一个空格
1.书写格式
示例代码:
存储过程SQL文书写格式例
select
c.dealerCode,
round(sum(c.submitSubletAmountDLR + c.submitPartsAmountDLR + c.submitLaborAmountDLR) / count(*), 2) as avg,
decode(null, 'x', 'xx', 'CNY')
from (
select
a.dealerCode,
a.submitSubletAmountDLR,
a.submitPartsAmountDLR,
a.submitLaborAmountDLR
from SRV_TWC_F a
where (to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)'
and to_char(a.ORIGSUBMITTIME, 'yyyy/mm/dd') <= 'Date Range(end)'
and nvl(a.deleteflag, '0') <> '1')
union all
select
b.dealerCode,
b.submitSubletAmountDLR,
b.submitPartsAmountDLR,
b.submitLaborAmountDLR
from SRV_TWCHistory_F b
where (to_char(b.ORIGSUBMITTIME, 'yyyy/mm/dd') >= 'Date Range(start)'
and to_char(b.ORIGSUBMITTIME,'yyyy/mm/dd') <= 'Date Range(end)'
and nvl(b.deleteflag,'0') <> '1')
) c
group by c.dealerCode
order by avg desc;
C#中里的SQL字符串书写格式例
strSQL = "insert into Snd_FinanceHistory_Tb "
+ "(DEALERCODE, "
+ "REQUESTSEQUECE, "
+ "HANDLETIME, "
+ "JOBFLAG, "
+ "FRAMENO, "
+ "INMONEY, "
+ "REMAINMONEY, "
+ "DELETEFLAG, "
+ "UPDATECOUNT, "
+ "CREUSER, "
+ "CREDATE, "
+ "HONORCHECKNO, "
+ "SEQ) "
+ "values ('" + draftInputDetail.dealerCode + "', "
+ "'" + draftInputDetail.requestsequece + "', "
+ "sysdate, "
+ "'07', "
+ "'" + frameNO + "', "
+ requestMoney + ", "
+ remainMoney + ", "
+ "'0', "
+ "0, "
+ "'" + draftStruct.employeeCode + "', "
+ "sysdate, "
+ "'" + draftInputDetail.honorCheckNo + "', "
+ index + ")";
1).缩进
对于存储过程文件,缩进为8个空格
对于C#里的SQL字符串,不可有缩进,即每一行字符串不可以空格开头
2).换行
1>.Select/From/Where/Order by/Group by等子句必须另其一行写
2>.Select子句内容如果只有一项,与Select同行写
3>.Select子句内容如果多于一项,每一项单独占一行,在对应Select的基础上向右缩进8个空格(C#无缩进)
4>.From子句内容如果只有一项,与From同行写
5>.From子句内容如果多于一项,每一项单独占一行,在对应From的基础上向右缩进8个空格(C#无缩进)
6>.Where子句的条件如果有多项,每一个条件占一行,以AND开头,且无缩进
7>.(Update)Set子句内容每一项单独占一行,无缩进
8>.Insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进
9>.SQL文中间不允许出现空行
10>.C#里单引号必须跟所属的SQL子句处在同一行,连接符("+")必须在行首
3).空格
1>.SQL内算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔
2>.逗号之后必须接一个空格
3>.关键字、保留字和左括号之间必须有一个空格
7.对数据库表操作的特殊要求
7.对数据库表操作的特殊要求
本项目对数据库表的操作还有以下特殊要求:
1).以逻辑删除替代物理删除
注意:现在数据库表中数据没有物理删除,只有逻辑删除
以deleteflag字段作为删除标志,deleteflag='1'代表此记录被逻辑删除,因此在查询数据时必须考虑deleteflag的因素,deleteflag的标准查询条件:NVL(deleteflag, '0') <> '1'
2).增加记录状态字段
数据库中的每张表基本都有以下字段:DELETEFLAG、UPDATECOUNT、CREDATE、CREUSER、UPDATETIME、UPDATEUSER
要注意在对标进行操作时必须考虑以下字段
插入一条记录时要置DELETEFLAG='0', UPDATECOUNT=0, CREDATE=sysdate, CREUSER=登录User;查询一条记录时要考虑DELETEFLAG,如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查 ;修改一条记录时要置UPDATETIME=sysdate, UPDATEUSER=登录User, UPDATECOUNT=(UPDATECOUNT+1) mod 1000, ;删除一条记录时要置DELETEFLAG='1'
3).历史表
数据库里部分表还存在相应的历史表,比如srv_twc_f和srv_twchistory_f,在查询数据时除了检索所在表之外,还必须检索相应的历史表,对二者的结果做Union(或Union All)
7.对数据库表操作的特殊要求
本项目对数据库表的操作还有以下特殊要求:
1).以逻辑删除替代物理删除
注意:现在数据库表中数据没有物理删除,只有逻辑删除
以deleteflag字段作为删除标志,deleteflag='1'代表此记录被逻辑删除,因此在查询数据时必须考虑deleteflag的因素,deleteflag的标准查询条件:NVL(deleteflag, '0') <> '1'
2).增加记录状态字段
数据库中的每张表基本都有以下字段:DELETEFLAG、UPDATECOUNT、CREDATE、CREUSER、UPDATETIME、UPDATEUSER
要注意在对标进行操作时必须考虑以下字段
插入一条记录时要置DELETEFLAG='0', UPDATECOUNT=0, CREDATE=sysdate, CREUSER=登录User;查询一条记录时要考虑DELETEFLAG,如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查 ;修改一条记录时要置UPDATETIME=sysdate, UPDATEUSER=登录User, UPDATECOUNT=(UPDATECOUNT+1) mod 1000, ;删除一条记录时要置DELETEFLAG='1'
3).历史表
数据库里部分表还存在相应的历史表,比如srv_twc_f和srv_twchistory_f,在查询数据时除了检索所在表之外,还必须检索相应的历史表,对二者的结果做Union(或Union All)