第10章存储过程关键词:存储过程创建存储过程执行存储过程存储过程的参数查看存储过程修改存储过程删除存储过程学习要求:本章主要阐述了存储过程的创建和使用方法。并且全面地、系统地介绍了存储过程的概念、存储过程的优点;系统存储过程的特点及用途;创建存储过程的方法;查看、修改和删除存储过程的方法。重点分析了存储过程的创建和使用方法。学习和掌握本章,是对SQLServer2000数据库的灵活运用。10.1概述1、存储过程——是为实现某个特定任务而编写的一段代码。2、存储过程的特点:●可以包含一条或多条Transact-SQL语句。●可以接受输入参数并可以返回输出值。●一个存储过程可以调用另一个存储过程。●会返回执行情况的状态代码给调用它的程序。3、存储过程的优点:●实现模块化编程。一个存储过程可以被多个用户共享和重用。●加快程序的运行速度。第一次执行后的存储过程会在缓冲区中创建查询树,使得第二次执行时不用进行预编译。●可以减少网络流量。存储过程存储在服务器上,只有触发执行存储过程的命令和返回结果才在网络上传输。●可以提高数据库安全性。可以只授予用户访问存储过程的权限,而不授予其直接修改数据表的权限。3、存储过程的分类:●系统存储过程。由系统自动创建,主要存储在master数据库中,一般以sp_为前缀。系统存储过程完成的功能主要是从系统表中获取信息。●用户自定义存储过程。由用户创建并能完成某一特定功能的存储过程。10.2创建存储过程1、使用CREATEPROCEDURE语句创建存储过程格式:CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[…n]其中各参数含义如下:●procedure_name:新存储过程的名称。●number:对同名的过程分组。●@parameter:过程中的参数。可以声明一个或多个参数。存储过程最多可以有2100个参数。●data_type:参数的数据类型。●VARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。●default:参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或NULL。●OUTPUT:表明参数是返回参数。该选项的值可以返回给EXE[UTE]。使用OUTPUT参数可将信息返回给调用过程。●RECOMPILE:表明SQLServer不会缓存该过程的计划,该过程将在运行时重新编译。●ENCRYPTION:表示SQLServer加密syscomments表中包含CREATEPROCEDURE语句文本的条目。●FORREPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。●sql_statement:过程中要包含的任意数目和类型的Transact-SQL语句。但有一些限制。创建存储过程时应该注意下面几点:●存储过程的最大大小为128MB。●用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在tempdb中创建)。●在单个批处理中,CREATEPROCEDURE语句不能与其他Transact-SQL语句组合使用。●存储过程可以嵌套使用,在一个存储过程中可以调用其他的存储过程。嵌套的最大深度不能超过32层。●存储过程如果创建了临时表,则该临时表只能用于该存储过程,而且当存储过程执行完毕后,临时表自动被删除。●创建存储过程时,“sq_statement”不能包含下面的Transact-SQL语句:SETSHOWPLAN_TEXT、SETSHOWMAN_ALL、CREATEVIEW、CREATEDEFAULT、CREATERULE、CREATEPROCEDURE和CREATETRIGGER。例1:创建用于检索所有学生的成绩记录的存储过程stud_degree。USEschool--判断stud_degree存储过程是否存在,若存在,则删除IFEXISTS(SELECTnameFROMsysobjectsWHEREname=’stud_degree’ANDtype=’P’)DROPPROCEDUREstud_degreeGOUSEschoolGO--创建存储过程stud_degreeCREATEPROCEDUREstud_degree/*无参过程*/ASSELECTstudent.sno,student.sname,course.cname,score.degreeFROMstudent,course,scoreWHEREstudent.sno=score.snoANDcourse.cno=score.cnoORDERBYstudent.snoGO通过下述SQL语句执行该存储过程:USEschool--判断stud_degree存储过程是否存在,若存在,则执行它IFEXISTS(SELECTnameFROMsysobjectsWHEREname=’stud_degree’ANDtype=’P’)EXECstud_degreeGO例2:创建一个带有参数的存储过程stu_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。USEschool--判断stud_info存储过程是否存在,若存在,则删除IFEXISTS(SELECTnameFROMsysobjectsWHEREname=’stud_info’ANDtype=’P’)DROPPROCEDUREstud_infoGOUSEschoolGO--创建存储过程stud_infoCREATEPROCEDUREstud_info@s_nochar(5)/*有参过程·形参*/ASSELECT*FROMstudentWHEREsno=@s_noGO通过下述SQL语句执行该存储过程:USEschool--判断stud_info存储过程是否存在,若存在,则执行它IFEXISTS(SELECTnameFROMsysobjectsWHEREname=’stud_info’ANDtype=’P’)EXECstud_info‘105’/*实参*/GO例3:创建一个带有参数的存储过程stu_age,该存储过程根据传入的学生编号,在student表中计算此学生的年龄,并根据程序的执行结果返回不同的值,程序执行成功,返回整数0,如果执行出错,则返回错误号。USEschool--判断stud_age存储过程是否存在,若存在,则删除IFEXISTS(SELECTnameFROMsysobjectsWHEREname=’stud_age’ANDtype=’P’)DROPPROCEDUREstud_ageGOUSEschoolGO--创建存储过程stud_ageCREATEPROCEDUREstud_age@s_nochar(5),/*有参过程*/@ageintOUTPUT/*返回参数*/AS--定义并初始化局部变量,用于保存返回值DECLARE@errorvalueintSET@errorvalue=0--求此学生的年龄SELECT@age=YEAR(GETDATE())-YEAR(sbirthday)FROMstudentWHEREsno=@s_no--根据程序的执行结果返回不同的值IF(@@ERROR0)SET@errorvalue=@@ERRORRETURN@errorvalue/*带回结果值*/GO该过程的调用在后面介绍。2、使用企业管理器创建存储过程使用企业管理器创建存储过程的操作步骤如下:(1)打开企业管理器,展开服务器组,并展开相应的服务器。(2)打开“数据库”文件夹,并打开要创建存储过程的数据库。(3)选择“存储过程”选项,右击鼠标,执行“新建存储过程”命令,打开创建存储过程对话框。(4)在“文本”列表框中显示了CREATEPROCEDURE语句的框架,可以修改要创建的存储过程的名称,然后加入存储过程所包含的SQL语句。(5)单击“检查语法”按钮可以检查创建存储过程的SQL语句的语法是否正确。(6)如果要将其设置为下次创建存储过程的模板,可单击“另存为模板”按钮。(7)完成后,单击“确定”按钮即可创建一个存储过程,如下图10-1所示。图10-1存储过程属性界面3、使用向导创建存储过程使用向导创建一个存储过程insert_table8_1,对应的操作步骤如下:(1)在企业管理器中,执行“工具”下拉菜单中的“向导”命令,打开“选择向导”对话框。(2)在“数据库”文件夹选择“创建存储过程”向导,单击“确定”按钮,出现创建存储过程向导欢迎对话框。单击“下一步”按钮。(3)在出现“选择数据库”对话框中,选择数据库后,单击“下一步”按钮,如下图10-2所示。图10-2选择向导界面(3)在出现“选择数据库”对话框中,选择数据库后,单击“下一步”按钮,如下图10-3所示。图10-3创建存储过程向导1(4)在出现“选择存储过程”对话框中列出了所有表,以及可以对表进行的插入、删除和更新操作。可以通过选中每个表对应的复选框来确定要对表进行的操作。例如,选择table8表后面的“插入”、“删除”、“更新”栏中的复选框。单击“下一步”按钮,如下图10-4所示。图10-4创建存储过程向导2(5)出现“正在完成创建存储过程向导”对话框。若单击“完成”按钮,即可完成存储过程的创建,如下图10-5所示。图10-5创建存储过程向导3(6)单击“编辑”按钮,打开“编辑存储过程属性”对话框,可编辑存储过程,如下图10-6所示。图10-6编辑存储过程属性(7)单击“编辑SQL”按钮,即可打开“编辑存储过程SQL”对话框,其中的列表框显示了创建该存储过程的Transact-SQL语句,可以在已有的Transact-SQL语句的基础上进行编辑,可以单击“分析”按钮来执行语法检查,如下图10-7所示。图10-7编辑存储过程SQL(8)单击“确定”按钮,返回到前面的“正在完成创建存储过程向导”对话框。10.3执行存储过程执行存储过程使用EXECUTE语句。格式:[[EXEC[UTE]][@return_status=]{procedure_name[;number]|@procedure_name_var}[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT][,…n][WITHRECOMPILE]主要参数含义:●EXECUTE:此语句是批处理的第一条语句时可以省略该关键字。●@return_status:是一个可选的整型变量,保存存储过程的返回状态。●@procedure_name_var:是局部定义变量名,代表存储过程名称。●@parameter:是过程参数(有参过程调用时使用)。●OUTPUT:指定存储过程必须返回一个参数。●WITHRECOMPILE:指定在执行存储过程时重新编译执行计划。10.4存储过程的参数1、使用参数例4:定义如下一个存储过程:CREATEPROCEDUREinsert_table8_1(@c1_1int,/*@c1_1和@c2_2是两个参数*/@c2_2datetime)ASINSERTINTOtest.dbo.table8(c1,c2)VALUES(@c1_1,@c2_2)GO可以使用下面的SQL语句调用该存储过程:USEtestGOEXECinsert_table8_12,’2005-10-1’GO或:EXECinsert_table8_1@c1_1=3,@c2_2=’2005-12-1’2、使用默认参数例5:创建一个存储过程insert_table8_2,该存储过程中包含两个参数,其默认值分别为10和‘2005-5-1’。USEtestGODELETEtable8/*删除表中全部记录*/GOCREATE