SQL编程命名规范
2 命名规则
2.1 表名
XXX相关表以r_作为前缀,YYY相关表以t_作为前缀。如r_acc 、t_bcc。
后台表名尽量与前台表名相同,后台独有的表应以_b作为后缀。如r_gggd_b。
命名应尽量反映存储的数据内容。
2.2 视图名
视图以v_作为前缀。由于前台无视图,故不需加_b。
命名应尽量体现各视图的功能。
2.3 触发器名
触发器名为相应的表名加上后缀,Insert触发器加''_i'',Delete触发器加''_d'',Update触发器加''_u'',如:r_bch_i,r_bch_d,r_bch_u。
2.4 存储过程名
存储过程应以''sp_''开头,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加BSC机架的DRT单板的存储过程为''sp_ins_board_drt''。
2.5 变量名
变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
2.6 命名中其他注意事项
以上命名都不得超过30个字符的系统限制。
变量名的长度限制为29(不包括标识字符@)。
数据对象、变量的命名都采用英文字符。禁止使用中文命名。
3 编程结构和描述
SQL SERVER系统中,一个批处理是从客户传给服务器的一个完整的包,可以包含若干条SQL语句。批处理中的语句是作为一组去进行语法分析、编译和执行的。触发器、存储过程等数据对象则是将批处理永久化的方法。
3.1 注释
注释可以包含在批处理中。在触发器、存储过程中包含描述性注释将大大增加文本的可读性和可维护性。本规范建议:
1、 注释以英文为主。
实际应用中,发现以中文注释的SQL语句版本在英文环境中不可用。为避免后续版本执行过程中发生某些异常错误,建议使用英文注释。
2、 注释尽可能详细、全面。
创建每一数据对象前,应具体描述该对象的功能和用途。
传入参数的含义应该有所说明。如果取值范围确定,也应该一并说明。取值有特定含义的变量(如boolean类型变量),应给出每个值的含义。
3、 注释语法包含两种情况:单行注释、多行注释
单行注释:注释前有两个连字符(--),最后以行尾序列(CR-LF)结束。一般,对变量、条件子句可以采用该类注释。
多行注释:符号/*和*/之间的内容为注释内容。对某项完整的操作建议使用该类注释。
4、 注释简洁,同时应描述清晰。
3.2 函数注释:
编写函数文本--如触发器、存储过程以及其他数据对象--时,必须为每个函数增加适当注释。该注释以多行注释为主,主要结构如下:
/************************************************************************
*name : --函数名
*function : --函数功能
*input : --输入参数
*output : --输出参数
*author : --作者
*CreateDate : --创建时间
*UpdateDate : --函数更改信息(包括作者、时间、更改内容等)
*************************************************************************/
CREATE PROCEDURE sp_xxx
…
3.3 条件执行语句if…else
条件语句块(statenemt block,以 begin…end为边界)仅在if子句的条件为真时才被执行。为提高代码的可读性,建议嵌套不多于5层。还有,当嵌套层次太多时,应该考虑是否可以使用case语句。
3.4 重复执行while和跳转语句goto
需要多次执行的语句,可以使用while结构。其中,控制while循环的条件在任何处理开始之前需要先执行一次。循环体中的保留字break无条件的退出while循环,然后继续处理后续语句;保留字continue重新计算while条件,如果条件为真,则从循环开始处重新执行各语句。
使用跳转语句goto和标签label也可以方便地实现循环和其他更灵活的操作。SQL SERVER仅具有单通道语法分析器,因此不能解析对尚未创建的对象所做的前向参考。换言之,跳转到某标签的后续语句应该是可执行的(如不存在可能尚未创建的数据对象)。
3.5 书写格式
数据库服务器端的触发器和存储过程是一类特殊的文本,为方便开发和维护,提高代码的易读性和可维护性。规范建议按照分级缩进格式编写该文本。
顺序执行的各命令位于同一级;条件语句块(statenemt block,以 begin…end为边界)位于下一级,类推。
SQL语句是该文本的主体。为适应某些教复杂的用户需求,SQL语句可能比较庞大。为方便阅读和维护,规范建议按照SQL语句中系统保留字的关键程度再划分为三级。具体分级请参照下表。其中,非系统保留字(如字段名、数据表名、标点符号)相对本级保留字再缩进一级。多个连续的非保留字可以分行书写,也可以写在同一行。当WHERE包含的条件子句教复杂时,应该每行只写一个条件分句,并为重要的条件字句填写单行注释。
在保证基本缩进格式的前提下,可以通过对齐某些重要关键字(如条件关键字AND、OR,符号 = 、 <> 等)来进一步提高文本的易读性和可维护性。
相邻两级的缩进量为10个空格。这也是ISQL编辑器默认的文本缩进量。另外,在ISQL编辑器中,一个TAB键也相当于10个空格。
注:按照功能,四类SQL语句(SELECT、INSERT、UPDATE、DELETE)的关键字可以划分为三类:主关键字、次关键字、一般关键字。如下表所示:
主关键字 次关键字 一般关键字
SELECTINSERT (INTO)UPDATEDELETE FROMWHEREVALUESINSERT…SELECT…FROM语句中的SELECT和FROM ANDORBETWEENINLIKE
3.6 字体
系统保留字应大写,包括系统公共变量等。其他字符(如用户自定义变量、用户自定义数据对象名)小写。
需要特殊强调的部分可以大写。
一条完整注释语句的首字符应大写。对某变量、某条件字句的注释可以全部使用小写。
通过下一节中生成表r_a的删除触发器的实例可以部分说明对象命名、注释、基本书写格式和字符大小写方面的一些注意事项。
4 触发器编程规范
4.1 范例
下面通过一个例子,说明触发器编程中应遵守的规范:
/* delete related r_a according to deleted table */
CREATE TRIGGER r_a_d ON r_a
FOR DELETE
AS
IF @@ROWCOUNT = 0 -no rows deleted
RETURN
/* delete r_b table related to deleted table */
DELETE r_b
FROM r_b b, deleted d
WHERE b.id=d.id
IF @@ERROR != 0
BEGIN
RAISERROR("Error occurred deleting related records", 16, 1)
ROLLBACK TRAN
END
RETURN
作以下几点说明:
1. 检查是否有行被修改。注意:不论数据是否被修改,触发器都会引发,执行情况取决于T-SQL语句的执行,而和任何潜在的where子句是否执行无关。
2. 因为被删除行在该表中不再可用,所以应在被删除的表中查看。
3. 检查T-SQL语句的返回代码,以捕获任何出错条件。
4.2 事务过程中的触发器
1. 触发器内的rollback将所有工作返回至最外层的begin tran,完成触发器内的处理并异常终止当前的批处理。
2. 不可以从触发器内部返回至某个已命名的事务过程,这将产生运行错误,挂起所有工作并终止批处理。
5 存储过程编程规范
5.1 带有参数的执行
在执行存储过程时,可以通过名字来制定参数,这样可以用任何顺序传递参数,而且自动起到注释的作用,因此建议编程时使用这种方法。
5.2 缺省参数值
把参数的缺省值定为null,这是捕获在过程内调用存储过程所产生的错误的常用方法,不应让标准服务器消息报告参数丢失。在给定缺省之后,可以校验该缺省值并在存储过程内采取措施。
注意,当附值SELECT语句不返回行时,局部变量将保持在SELECT语句执行之前所具有的值。建议使用系统提供的某些全局变量(如@@ROWCOUNT)检测SELECT返回的结果。
5.3 返回值
每个存储过程自动返回一个整数型的状态值:成功完成时返回0,而返回-1~-99表示SQL Server检测到了错误。以下为SQL Server系统常用的返回状态码:
值 含义
0 Procedure was executed successfully
?-1 Object missing
?-2 Datatype error occurred
?-3 Process was chosen as deadlock victim
? -4 Permission error occurred
?-5 Syntax error occurred
? -6 Miscellaneous user error occurred
?-7 Resource error, such as out of space, occurred
? -8 Non-fatal internal problem encountered
?-9 System limit was reached
??-10 Fatal internal inconsistency occurred
??-11 Fatal internal inconsistency occurred
??-12 Table or index is corrupt
??-13 Database is corrupt
?-14 Hardware error occurred
在程序中,用return语句可指定大于0或小于-99的返回值,调用程序可以设置局部变量接收和检查返回状态。
5.4 存储过程和事务处理
如果事务处理在存储过程返回时的嵌套层次与执行时的层次不同,SQL Server会显示信息提示事务处理嵌套失控。因为存储过程并不异常终止该批处理,在执行和确认随后的语句时,过程内的rollback tran 会导致数据完整性损失。
在编写存储过程时,应遵守以下原则:
1. 过程对@@trancount应无净改变。
2. 仅当存储过程发出begin tran语句时,才发出rollback tran。
5.5 其他注意事项
存储过程应该坚实可靠的,因为它们是驻留在服务器中,被频繁使用的。应仔细检查参数的有效性,并在有问题时返回出错信息。应确保参数的数据类型和被比较的栏的数据类型匹配,从而避免数据类型匹配错误。在每个SQL语句之后要检查@@error。
6 数据对象的国际化
6.1 关于数据对象的命名
数据对象和变量的命名一律采用英文字符。禁止使用中文命名。其他命名注意事项和规范请参考2命名规则。
6.2 关于RAISERROR
SQL SERVER 系统的RAISERROR命令能够把某个出错情况返回给调用过程,这对说明调用过程的执行情况很有必要;同时可以部分避免客户端的冗余操作。另外,结合系统存储过程sp_addmessage和sp_dropmessage可以方便实现数据对象在SQL SERVER端的国际化。
SQL SERVER的MASTER数据库中有错误信息数据表sysmessages,专门用于存储系统和用户的错误提示及相关信息(如错误ID号、错误等级、状态)。用户可以调用sp_addmessage和sp_dropmessage预先将各类错误信息记入该数据表。其中,不同的错误信息用错误ID号区分。在编写存储过程代码时,调用RAISERROR函数从错误信息表sysmessages中引用相关错误ID号的错误信息。
由于0~50000的值是保留为 SQL SERVER使用的,所以用户自定义错误信息的错误ID号必须大于50000。
RAISERROR的语法如下:
RAISERROR ({msg_id msg_str}, severity, state )
本规范建议存储过程以RAISERROR和RETURN返回。
举例如下:
l 第一步:生成该错误信息
/*insert a error message into the master..sysmessages*/
sp_addMessage 50001 ,16 ,''Can"t update the primary key from table %s''
l 第二步:执行存储过程sp_xxx,异常返回时引用上述错误信息
CREATE PROCEDURE sp_xxx
BEGIN
…
RAISERROR(50001 ,16 ,1 ,''r_a'') -- Can"t update the primary key from table r_a
ROLLBACK TRAN
RETURN(1)
END
l 第三步:在DELPHI调用中,通过EDBEngineError捕捉该错误
try
sp_test.execProc ;
except
on e :EDBEngineError
if e.errors[1].errorcode = 13059 then
/*hint ''Can"t update the primary key from table r_a''*/
showMessage(e.errors[1].message)
end ;
l 第四步:当不再使用该错误信息时,应该从错误信息表中删除相应数据
sp_dropMessage 50001
l 第五步:错误提示信息国际化
用相应语言替换master..sysmessages表中用户自定义的错误消息即可。
其实这是一个项目习惯的问题,看你自己喜欢了,比如说:
等我有钱了,我要买两辆法拉利,自己开一辆,拖一辆!呵呵,有点类似的意思,只要有一个大概的基本规则及框架限定,项目组成员能够较流畅的遵循就行。
给大家抄上几篇吧:
http://www.liulee.net/topics/cont_gf.htm
http://www.csdn.net/expert/topic/275/275741.xml?temp=.311062
http://www.csdn.net/expert/topic/412/412313.xml?temp=.9621851
系统编程规范
总体要求:
开发的系统具有较强的通用性、申缩性,并有较强的响音速度。同时开发过程中必须严格按照规范,以便于管理和协同开发。
通用性:能适应机构变动。
伸缩性:程序模块化,程序模块能进行任何组合。
规范性:截面统一,原程序和SQL文件便于他人阅读。
一、系统的目录结构
E:\yh_petrifaction pbl、pbd、ini文件
E:\yh_petrifaction\bmp 各种图片
E:\yh_petrifaction\word 各种文档
E:\yh_petrifaction\sql sql文件
E:\yh_petrifaction\dll 动态库文件
E:\yh_petrifaction\exe 执行文件
二、编程规范
1:应用程序编写在Windows98下分分辨率为800X600,小字体。
2 为提高EXE文件执行速度PBL文件不大于600K,主要按功能模块分,一模块大于600K。可按窗口、数据窗口细分。
3 系统公用PBL有以下几个:
wu_ppublic 系统公共模块
wu_epublic 系统公共延伸模块
2.1window窗口
原则:仿WINDOW的标准界面
l 窗口上控件放置
用户界面中常用的元素(Item)包括各种控制(如PushButton DheckBox等)、数据(如ListItem)、文本。
一个界面中各个元素的大小(宽与高)和摆放应做到使整个界面整齐美观,保证不影响数据的显示和输入的前提下,应遵循以下原则:
n 在一个界面中,所有同类型的元素(如两个按钮或两个单行编辑框)应具有相同的高度,使用相同的显示字体;
n 同一例上的元素,在不影响显示和输入时,尽量具有相同的宽度;
n 同一例上的元素,排列时应向左对齐;
n 同一例上的元素,排列时应向下对齐;
n 当一个界面中的元素较多时,可以使用一条或多条横线或竖线将界面划分为几个相对独立的部分。
n 整个界面中各元素的排列要均衡,疏密适当,同一行或同一列上的各个元素间的间隔要保持一致。
l 窗口取名
l 对象取名
各OBJECT必须要有容易理解的名字
统一NAME如下:
COMMANDBUTTON:
Cb_Ok [确定(&Y)]
Cb_Cancel [取消(&C)]
Cb_Apply [应用(&A)]
Cb_Return [返回(&R)]
Cb_Print [打印(&P)]
Cb_Gen [生成(&G)]
Cb_Query [查询(&Q)]
Cb_Sort [排序(&S)]
Cb_Add [新增(&A)]
Cb_Insert [插入(&I)]
Cb_Del [删除(&D)]
Cb_Next [下一条(&N)]
Cb_Prior [前一条(&P)]
DataWindow dw_1(2,3,4,5)
Radiobutton rb_name
CheckBox cbx_name
ListBox lb_name
DropDownListBox ddlb_name
SingleEditLine sle_name
EditMask em_name
TreeView tv_name
PictureListBox plb_name
l 风格
Window底,主窗口用MDI,功能WINDOW为MAIN。
一般情况,MDI为第一级,Sheet窗口为第二级,Response窗口为第三级,Sheet窗口用OpenSheet()函数打开
l 按钮
n 窗口中按钮分为两类:
一为按钮触发的动作会影响到整个窗口的内容,如“确定”、“退出”等。这种按钮应尽量排在窗口的右侧或下侧。
另一类按钮触发的动作会只会影响到窗口中某个数据域或某个显示域,这种按钮应尽量排在其受影响域的右侧或下侧。
n 对于一个窗口的按钮,可以设置其中一个为缺省(Default)按钮。基于Windows系统的我,操作员可以按下“回车”或“空格”键触发缺省按钮、设置缺省按钮可以简化操作员的操作。
n 缺省按钮可以在界面设计时指定,同时也可以在程序运行过程中动态设置。通常“确定”,“应用”设置为缺省,
“取消”设置为Cancel
l 数据输入区(Data Entry Area)
n 数据输入区指的是在界面中操作员输入各种数据的区域,输入区中数据排列序按从上到下、从左到右的顺序排列。
n 对于需要一次输入多个不同项目的输入区,应将所有数据域全部排在输入区中,同时显示,不得使用滚动条。
n 对于需要一次输入多条相同项目的输入区,可以使用垂直滚动条,但应为输入区设置足够高度,使得在大多数情况下不必使用滚动条即可录入全部数据。在数据输入区中不得使用水平滚动条。
2.2 Datawindow 数据窗口
取名:dw_name
A、允许修改或录入的为,不允许修改或录入的为灰底;
B、窗口中数据窗口控制取名为dw_1,dw_2…
C、用于数据窗口的DropDownDataWindow取名为dddw_name;
D、所有文本的NAME必须加_t;
E、打印数据必须有title,显示时不需要,必须有打印时间
F、用于输入的一般为FreeFrom格式,标签为无框。输入域为凹框、白底黑字,底为灰色,不可修改为灰色显示;
G、用于查询的一般为Grid格式,标签可为无框。显示为无框,底面为白色。
2.3 Menu 菜单
A、菜单必须有ToolBar
B、菜单的热键和快捷键必须与Window98标准相同。
2.4Script编程
A、取编号加1为当前编号
B、变量取名规则
局部变量::L+变量类型_+NAME;如int 变量 li_row;;
实列变量::I+变量类型_+NAME;如int 变量 ii_row;;
全局变量::g+变量类型_+NAME;如int 变量 gi_row;;
参数: a+变量类型_+NAME;如int 变量 ai_row;;
C、通用部门写成Function
D、自定义的Userevent取名为ue_name
E、自定义函数取名:
全局函数: gf_name
窗口函数: wf_name
用户对象函数:of_name
F、自定义函数在函数头部注名函数编写人,功能描述,输入、输出参数。
2.5 其他
l 存盘、关闭、退出等动作的检查和确认
当操作员在窗口中输入数据后选择“存盘”操作时,系统检查各种数据是否完整、合法如果数据有误、系统给予相应提示;当操作员选择“关闭”或“退出”操作时,系统应提示操作员是否放弃输入数据。
l 界面的颜色设置
基本系统中用户界面的使用频率非常高,为了防止操作员视觉疲劳,界面中应尽量避免使用过多颜色。特别是一些鲜艳、明亮颜色,如红色等,一般情况只采用灰、白、黑色。
界面中的颜色应具有一定的提示功能,对于不同的数据显示区或输入应使用不同的颜色,建议统一采用以下方案:
1、 需要操作员输入或选择的地方,采用白底黑字凹框;
2、 有程序员自动生成的或不允许操作员修改的数据,采用黑字背景为灰色;
3、 普通提示信息,采用灰底黑字;
4、 整个界面背景颜色,采用灰色;
l 错误操作的屏蔽和检查
我们的系统面向的使用者不是专业计算机人员,使用者对Windows环境和应用系统的操作方法的熟悉有限,有可能发生各种错误操作。
为了尽可能减少使用者的错误操作对系统带来的影响,系统必须具有相当的错误屏蔽能力。因此,在界面设计中至少要考虑以下两点:
1、 除界面上预定义的热键外,其他任何键盘操作应对系统不起作用防止误动作在进行任何重要操作(如删除、退出等)之前,必须对使用者加以提示,提示中应说明该操作的后果(如删除不能恢复等),使用都确认后再操作。
2、 ;另外,还可能存在以下情况
使用者操作完全正确,但输入的数据不合理。如:在应该输入数字的地方输入字母或数据位不对;输入的某些日期不合法等;对于这一类错误,有些可以在界面设计时加以控制(如数字位数,)另外需要在程序中加以检查(如日期),要尽量避免错误或不合法数据进入数据库,给下一步处理造成麻烦。
l 默认值
为简化操作,在输入窗口中,要求操作员输入的数据域应尽可能设置默认值。但对于一些起比较重要数据,为避免操作员疏忽造成错输,可以避免设置默认值,同时在关闭窗口前检查该数据是否输入。
三、开发细节注意事项
1、 一般情况下不加图片,
2、 一般情况下不得擅加全局变量,如需要,有组长增加。
3、 在编写程序中,应屏蔽系统错误提示。
4、 在编写的对象必须加注释,说明对象用处,注释格式为注释内容+“-”+程序员名。
一、表名
1、基础表(一般整个系统都要用到,三个子系统以上用到都算作基础表) ba开头,后面用英文单词,首字母大写,需要多个英文词的每个单词首字母大写 如baDepartment baGroup baDepartmentGroup
2、专用表(一般只有某几个子系统要用到) xx开头,xx为主要用得的子系统缩写,后面的同基础表 如:paBalance
3、临时表(在存储过程和触发器中) #开头后面是来源的表名 如:#baGroup
或者##开头 后面是调用的客户端机器名+时间,由存储过程产生,免得冲突
二、视图
vi开头 后面基本同基础表,只是有时需要描述固定参数,单词会更多,必要时作一些简化,如:viDeptForProcss
三、存储过程
pr开头 后面基本同基础表,描述功能,单词会更多,必要时作一些简化
四、函数
fn开头 其它同存储过程
五、字段
类型(两位,小写)+字段意义,也是单词首字节大写,其它小写
六、触发器
1、tr_表名 for(after) insert,update,delete (比较多这个类型的触发器)
2、tr_表名_Insert for(after) insert
3、tr_表名_Update for(after) update
4、tr_表名_Delete for(after) delete
5、ti_表名(或者视图名) INSTEAD OF insert,update,delete (没写过这种触发器)
6、ti_表名(或者视图名)_Insert INSTEAD OF insert
7、ti_表名(或者视图名)_Update INSTEAD OF update
8、ti_表名(或者视图名)_Delete INSTEAD OF delete
七、自定义数据类型
ud开头,Type结尾,中间是类型的描述,大小写同基础表
八、Default名
df_表名_字段名
九、Rule名
ru_字段名
十、PRIMARY KEY 名
pk_表名
十一、UNIQUE 名
uq_表名_字段名1_字段名2...
十二、外键(REFERENCES约束)名
fk_从表名_主表名_字段名1_字段名2...
其中十一、十二可能很长,必要时减少字段名的前缀
我觉得存储过程、触发器如何写得易懂也很重要,现在我大小写很乱,但是语句基本上是:
insert into tablename (
col1 ,
col2 ,
col3
)
values (
''a'' ,
1 ,
@col3
)
insert into tablename1 (
col1 ,
col2 ,
col3
)
select
col1 ,
1 as col2 ,
@col3 as col3
from tablename2
where con1
and con2
跳格用tab
不知道这样会不会看得明白些,反正自己看自己的比较清楚。