1、版权所有 天津大学计算机基础教学部 2004.8 第 1 页存储过程触发器事务和锁第 5章 T-SQL程序设计版权所有 天津大学计算机基础教学部 2004.8 第 2 页5.1 存储过程5.1.1 存储过程的概念 一组已被编辑在一起的,存储在服务器上,执行某种功能的预编译 SQL语句。 存储过程是一段在服务器上执行的程序,他在服务器端对数据库记录进行处理,再把结果返回到客户端。5.1.2 存储过程的优点 加快查询的执行速度。由于存储过程第一次被执行后,其执行规划就存储在高速缓存中。在以后的操作中,只需从高速缓存中调用编译好的存储过程的二进制代码执行即可。版权所有 天津大学计算机基础教学部 20
2、04.8 第 3 页5.1 存储过程 减少网络的数据流量对于需要很多条 T-SQL语句才能完成任务的操作,只需要在网络间传送单独指令就可实现,省去了逐条发送指令所需的网络流量。另一方面避免把大量的数据从服务器下载到客户端,减少网络上传输量,服务器只需将计算结果传给客户端即可。因此可以提高客户端的工作效率。 提供了一种安全机制只要用户被授予执行存储过程的权限,则不管用户是否被授予了存储过程操作过程中涉及的权限(如修改表),他都可以毫无限制的执行它。版权所有 天津大学计算机基础教学部 2004.8 第 4 页5.1 存储过程 允许程序模块化设计客户端不需要知道复杂的数据结构或业务逻辑过程,只需把查
3、询指令通过存储过程发给服务器,服务器就能把需要的数据返回给用户。因此可以把大量的业务逻辑用存储过程封装起来,当数据结构发生变化时,只需要改动组成过程的算法。使存储过程可独立于程序源代码而单独修改,提高了程序的可重用性。版权所有 天津大学计算机基础教学部 2004.8 第 5 页5.1 存储过程5.1.3 存储过程的分类 系统存储过程。存储在 master数据库中。又分为一般系统存储过程(以 sp_为前缀)和扩展存储过程(以 xp_为前缀)。 用户存储过程。5.1.4 创建存储过程CREATE PROCEDURE 存储过程名 AS 5.1.4.1不带参数的存储过程如:从数据库的 student,
4、 student_course,course表中查询,返回学生学号、姓名、课程号、成绩、学分。版权所有 天津大学计算机基础教学部 2004.8 第 6 页5.1 存储过程Create procedure student_infoAsSelect a.sno, sname, cno, sgrade, creditFrom Student a inner join student_course bOn a.sno=b.sno inner join course tOn o=ogo版权所有 天津大学计算机基础教学部 2004.8 第 7 页5.1 存储过程5.1.4.2 带参数的存储过程如:从数据库
5、的三个表中查询某人指定课程的成绩和学分Create procedure student_info1name char(8),cname char(16)AsSelect a.sno, sname, cno, sgrade, creditFrom student a inner join student_course bOn a.sno=b.sno inner join course tOn o=oWhere a.sname=name and ame=cname版权所有 天津大学计算机基础教学部 2004.8 第 8 页5.1 存储过程5.1.4.3 带默认值参数的存储过程如:从三个表的连接中返
6、回制定学生的学号、姓名、所选课程名称及该课程的成绩 ,如果没有提供参数,则使用默认值Create procedure st_infoname varchar(30)=刘 %AsSelect a.sno, a.sname, o, b.sgradeFrom student a inner join student_course bOn a.sno=b.sno inner join course tOn o=oWhere sname like name版权所有 天津大学计算机基础教学部 2004.8 第 9 页5.1 存储过程5.1.4.4 通过参数返回数据的存储过程 如:计算指定学生的总学分。 C
7、reate procedure totalcreditname varchar(40), total int outputAsSelect total=sum(credit)From student, student_course, courseWhere student.name=name and student.sno=student_course.snoGroup by student.sno版权所有 天津大学计算机基础教学部 2004.8 第 10 页5.1 存储过程5.1.5 使用存储过程的注意事项 存储过程所用的查询只在编译时进行优化。当对数据库表进行了索引等影响数据库统计的修改后,已编译的存储过程可能会失去效率。这时必须重新编译存储过程,以重新优化查询。使用系统存储过程 sp_recompile对存储过程进行重新编译。如EXEC sp_recompile company将对基于表 company的存储过程重新编译。 在存储过程中创建的临时表,只能用于该存储过程,当存储过程执行完毕后,临时表自动销毁。