SQL SERVER
存储过程
编写规范
1 创建存储过程的语法
use <database name>
go
if exist …
drop PROCEDURE <usename>.<procedure_name>
go
set
set
CREATE PROCEDURE <usename>.<procedure_name>
[[(]@parameter_name datatype [OUTPUT]
[,@parameter_name datatype [OUTPUT]]..[]]
AS
Begin
SQL_statements
End
Go
Set
Set
2 存储过程命名约定
存储过程的命名必须符合
P_调用分类_功能分类_详细名称格式,其中 P表示是存储过程,详细名称是与存储过程意义相关联的汉语拼音首字母,
按调用者分类:
公用类——
GY
内部用——
NB
按功能分类:
查询类:
CX
数据维护类:
WH
业务处理类:
YW
例:
P_NB_YW_GFQS
3 变量名
参数命名约定:
@a+变量类型+’_’+名称,变量类型和名称用小写。
变量类型
|
前缀
|
Integer
|
@ai_
|
Smallinteger
|
@asi_
|
Tinyint
|
@ati_
|
Varchar
|
@avc_
|
Char
|
@ac_
|
Numeric
|
@an_
|
Datetime
|
@adt
|
Smalldatetime
|
@asdt
|
内部变量命名约定:
@+变量类型+’_’+名称,变量类型和名称用小写。
变量类型
|
前缀
|
Integer
|
@i_
|
Smallinteger
|
@si_
|
Tinyint
|
@ti_
|
Varchar
|
@vc_
|
Char
|
@c_
|
Numeric
|
@n_
|
Datetime
|
@dt
|
Smalldatetime
|
@sdt
|
4 内部调用光标名
Cur_+名称,名称用小写,第一个字母大写。
用全局变量
@@sqlstatus来判断光标执行是否成功。
@@sqlstatus返回值:
0为成功,1表示失败,2表示未取到数据。
内部创建临时表命名规范:
#tmp_+功能代码+’_”+名称
如:
#tmp_pay_owe
5 返回值约定
建议:返回值用字符串,出错时错误信息直接由该串返回,成功时返回空串
同时编写通用错误处理过程(见11章)。
’0’ 为成功,’<0’ 为失败,’1’----‘99’为其它类型返回值。
用
RETURN返回值,例如
:
RETURN 0
6 备注
过程前有文字说明,说明本过程是做什么的;调用者是谁;返回值的含义;参数的含义;输入数据库;输出数据库;每一步操作前有文字说明,说明该操作达到的目的。
格式为
:
/******************************************************************概要说明:
中文名称:
用
途:
数 据 库:
语法信息:
输入参数:
输出参数:
调用举例
:
外部联系:
上级调用:
下级调用:
输 入 表:
输 出 表:
功能修订:
简要说明:
修订记录:
<修订日期
> <修订人> : 修改内容简要说明
〈续简要说明
>
<修订日期
> <修订人> : 修改内容简要说明
〈续简要说明
>
******************************************************************/
7 每一个存储过程均需按模板填写详细的设计文档
见附件。
8 语句格式
循环语句顶头,循环里的语句缩进两个空格。
例如:
WHILE 条件
BEGIN
…
…
END
8.1 在一个过程的起始处用DECLARE语句将所有变量一起加以定义,并按变量类型顺序加以定义。
8.2 最大限度为80个字符宽。
8.3 对函数和关键词用大写,其它场合用小写。
8.4 对SQL语句特别是INERT、DELETE、UPDATE语句成功与否的判断,用全局变量@@error和@@rowcount来判断。
@@error返回值:
0为成功。
@@rowcount返回值:
0为没有记录被改动。由于@@rowcount的值受每个执行命令的影响,因此应在SQL语句后立即判断@@rowcount的值,或声名一个局部变量来保存@@rowcount的值。
8.5 SELECT、INSERT语句选择出多字段时,不要一个字段占一行,而采用以下形式
SELECT @c_dev_no = Dev_no, @n_pay_no = Pay_no, @c_usr_name = Usr_name
FROM Tel_bas_infot
WHERE Usr_no = @c_usr_no
8.6 采用规范的缩进文本格式书写
一般设置: TAB = 4, 并将TAB自动转换为空格;
若有多个Begin…End语句嵌套时采用如下方式
BEGIN /*1*/
…
BEGIN /*1.1*/
…
BEGIN /*1.1.1*/
…
END /*1.1.1*/
BEGIN /*1.1.2*/
…
END /*1.1.2*/
END /*1.1*/
END /*1*/
其中
1表示第一级嵌套,1.1表示第二级嵌套,1.1.1表示第三级嵌套,1.1.2表示第三级的第二个嵌套… ,一般不要超过三级嵌套。
9 使用存储过程的注意事项
9.1 当存储过程的某一部分出错时,均用ROLLBACK TRANSACTION 对整个事务(如果采用事务处理的话)进行回退。(只能运行一次过程的要采用事务)
9.2 存储过程中的注释
单行要用--
大段注释用 /* 注释内容 */ 的形式。
9.3 一个存储过程可以调用其他存储过程,这种嵌套调用的层数限于16,当前嵌套层数的值保存在全局变量@@nestlevel中。
9.4 可以在自己的SQL Server上执行另一个SQL Server上的存储过程,这时另一个SQL Server 的名字应作为过程名的前缀。
但是远程过程的调用并非看作事务的一部分。所以当在一个事务进行远程的调用后,远程过程在远程服务器上的修改不能滚回。
9.5 当创建过程和执行过程的语句均包括带参数名的OUTPUT选择时,过程将给调用者返回一个值。
9.6 CREATE PROCEDURE 语句本身可包含在任意数目和类型的SQL语句,但USE和下面的CREATE 语句除外
CREATE VIEW ,
CREATE DEFAULT ,CREATE RULE ,
CREATE TRIGGER ,
CREATE PROCEDURE
9.7 如果执行一个调用其它过程的过程,被调用的过程可以存取第一个过程所生成的目标,如临时表。
9.8 如果在过程内生成临时表(#),该临时表仅为该过程而存在;退出该过程时,该临时表自动消失。
为规范起见,要求退出前将其drop。
9.9 可以用sp_rename objname,newname将存储过程改名。
对其它被过程引用的对象的更名在重编译后会出问题,必须引起注意。可用
sp_help,sp_helptext及sp_depends查看关于某过程的情况。建议不要用sp_rename,而采用先drop 后create 的方法。
10 附件
存储过程详细设计
存储过程详细设计
名称
概要说明
中文名称:
用
途:
数 据 库:
语法信息
输入参数:
输出参数:
调用举例
:
外部联系
上级调用:
下级调用:
输 入 表:
输 出 表:
功能修订
简要说明:
修订记录:
处理流程:
1 错误处理
内部错误处理应采用通用错误处理过程,所有错误信息统一编号备查,便于维护
错误代码
|
错误说明
|
备注
|
|
|
|
|
|
|
|
|
|
|
|
|