第第1010章存储过程章存储过程概述概述•问题要把某完成功能的SQL做成类似C语言的函数,供需要时调用,如何做?•什么是存储过程?是一组被编译在一起的T-SQL语句的集合,它们被集合在一起以完成一个特定的任务。•存储过程的分类–系统存储过程。–扩展存储过程(提供从SQLServer到外部程序的接口,以便进行各种维护活动)。–用户自定义的存储过程。•系统执行T-SQL语句的步骤–T-SQL语句发送到服务器。–服务器编译T-SQL语句。–优化产生查询执行计划。–数据库引擎执行查询计划。–执行结果发回客户程序。•注意:存储过程是SQL语句和部分流控语句的预编译集合,存储过程被进行了编译和优化。当存储过程第一次执行时,SQLServer为其产生查询计划并将其保留在内存中,这样以后在调用该存储过程时就不必再进行编译,这能在一定程度上改善系统的性能。存储过程的作用存储过程的作用•从以下几个方面考虑1.模块化编程创建一个存储过程存放在数据库中后,就可以被其他程序反复使用。2.快速执行存储过程第一次被执行后,就驻留在内存中。以后执行就省去了重新分析、优化、编译的过程。3.减少网络通信量有了存储过程后,在网络上只要一条语句就能执行一个存储过程。4.安全机制通过隔离和加密的方法提高了数据库的安全性,通过授权可以让用户只能执行存储过程而不能直接访问数据库对象。•在下例情况下,将使用到存储过程:(1)不需要任何客户端信息而在服务器端完成的操作;(2)涉及到大量行的操作、运算;(3)频繁的、周期性的操作;(4)那些被多个模块共同执行的操作。存储过程和视图的比较存储过程和视图的比较视图存储过程语句只能是SELECT语句可以包含程序流、逻辑以及SELECT语句输入、返回结果不能接受参数,只能返回结果集可以有输入输出参数,也可以有返回值典型应用多个表格的连接查询完成某个特定的较复杂的任务创建、执行简单的存储过程创建、执行简单的存储过程•创建格式CREATEPROCEDUREproc_name[WITHENCRYPTION][WITHRECOMPILE]ASSql_statements其中:WITHENCRYPTION对存储过程进行加密。WITHRECOMPILE对存储过程重新编译。【问题】创建一个名为p_Student的存储过程,返回student表中班级编码为20000001的学生信息。CREATEPROCEDUREp_StudentASSELECT*FROMStudentWHEREClassNo='20000001'•执行格式EXECproc_name【例】使用Transact-SQL语句执行前例中创建的名为p_Student的存储过程。EXECp_Student•查看存储过程的属性【例10.3】在企业管理器中查看存储过程p_Student的属性。练习练习111.创建一个名为p_StuByClass的存储过程,返回“00电子商务”班的所有学生的信息。2.执行该存储过程,并使用企业管理器查看该存储过程的定义。创建带输入参数的存储过程创建带输入参数的存储过程创建格式CREATEPROCEDUREproc_name@para_namedatatype[=default],…[WITHENCRYPTION][WITHRECOMPILE]ASSql_statements•各参数的意义如下:@para_name存储过程的参数名,必须以符号@为前缀。datatype参数的数据类型。default参数的默认值,如果执行存储过程时未提供该参数的变量值,则使用default值。【例】创建一个名为p_StudentPara的存储过程,该存储过程根据给定的班级编码显示该班级所有学生的信息。设计思路:•例10.1中AS后的语句SELECT*FROMStudentWHEREClassNo=‘20000001’,将固定的班级代码“20000001”用变量代替变为:SELECT*FROMStudentWHEREClassNo=@ClassNo。注意,其中变量名@ClassNo以@开头,@ClassNo变量取代了固定值20000001。•由于使用了变量,所以需要定义该变量,因为班级代码是8位字符串,所以在AS之前定义变量@ClassNoVARCHAR(8)。在查询分析器中运行如下命令:CREATEPROCEDUREp_StudentPara@ClassNoVARCHAR(8)ASSELECT*FROMStudentWHEREClassNo=@ClassNo练习练习221.创建一个名为p_StuByPara的存储过程,根据给定的班级编码和学生学号,显示相应学生的信息。执行带输入参数的存储过程执行带输入参数的存储过程•使用参数名传递参数值通过@para_name=value给出参数的传递值。当存储过程含有多个输入参数时,参数值可以按任意顺序设定,对于允许空值和具...