目录
一、存储过程概念
1.概念
存储过程是存放在数据库服务器上的预先定义与编译好的T-SQL语句集合,是一个独立的数据库对象。
2.特点
实现了模块化编程。
存储过程具有对数据库立即访问的功能。
使用存储过程可以加快程序的运行速度。
使用存储过程可以减少网络流量。
使用存储过程可以提高数据库的安全性。
存储过程由应用程序激活,而不是由系统自动执行
存储过程可以接受输入参数和返回值。
二、存储过程的创建
存储过程的定义主要包括两部分:一是过程名及参数的说明;二是过程体的说明。创建存储过程的语句一般形式如下:
说明:
⑴ 参数列表:由一个或多个参数说明组成,每个参数说明包括
参数名和参数的数据类型。当然,存储过程可以
没有任何参数。
参数格式为: 参数名 数据类型 [=缺省值] [OUTPUT]
⑵ 过程体:是实现存储过程功能的一组T-SQL语句,可以包含任意多的SQL语句。
①但sql语句中不能使用CREATE(VIEW、TRIGER、DEFAULT、RULE、PROCEDURE等)语句,
同时要慎重使用其他的CREATE、DROP等语句。
②为了使存储过程的设计更方便,功能更强大。可使用流程控制语句,主要有以下几种:
· 赋值语句。可将SQL表达式的值赋值给局部变量。
· 分支语句。用于设计分支程序。如: IF语句、CASE语句等。
· 循环语句。如:WHILE等语句。
· 调用存储过程语句CALL,或EXECUTE和从存储过程返回语句RETURN。
③在存储体中除了可以使用流程控制语句外,还可以使用游标。
例1 创建一个不带参数的存储过程,完成查询每位学生的选课情况及其成绩。
use exp6; go CREATE procedure Proc1 AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,cj WHERE Student.Sno=cj.Sno AND Course.Cno=cj.Cno GO execute Proc1 --执行存储过程
最后一句运行结果:
例2 创建一个带参数的存储过程,完成查询指定课程的选修情况。
go CREATE PROCEDURE Proc2 @x CHAR(2) AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,Cj WHERE Student.Sno=Cj.Sno AND Course.Cno=Cj.Cno and Cj.Cno=@x ORDER by Cj.Sno GO -- 2号课程选修情况 execute Proc2 2
最后一句运行结果:
例3 创建一个带参数并有返回值的存储过程,完成输出指定学号的学生的‘2’号课程的成绩,并将结果,赋给一输出参数。
go CREATE PROCEDURE Proc3 @x CHAR(10),@vgrade INT OUTPUT --输出参数 AS SELECT @vgrade=Grade FROM cj WHERE Sno=@x AND Cno='2' RETURN --只有一个输出参数 当然返回他了 go --执行 declare @v1 char(9),@v2 smallint select @v1='2000201' --赋值 --查询学号为@v1的2号课程的成绩 并将结果赋给输出参数@v2 exec Proc3 @v1,@v2 output --output不能省略 形参实参位置都要 print @v2 --运行结果: 40
执行存储过程:EXEC[UTE] <存储过程名> [ [过程参数变量=] {值| 变量 [OUTPUT] …} --exec和execute都行
例4,(返回多个参数)输入参数指定出版社名称,输出参数包含书总册数(类别数),和总价值
go create procedure proc2 @publish varchar(40),@sumprice decimal output,@sum int output as select @sumprice=sum(price) from Book where publish=@publish select @sum=count(*) from Book where publish=@publish go -- drop proc proc2 declare @publish2 varchar(40),@sum2 int,@sumprice2 decimal set @publish2='清华大学出版社' exec proc2 @publish2,@sumprice2 output,@sum2 output --output不能少 select @publish2 '出版社',@sum2 '总册数',@sumprice2 '总价值' -- 执行结果 出版社 总册数 总价值 清华大学出版社 3 105
三. 修改和删除存储过程
⑴修改存储过程:
语句格式: ALTER PROC[EDURE] <存储过程名> {同定义}
⑵删除存储过程:DROP PROCEDURE
语句格式: DROP PROC[EDURE] <存储过程名>
eg:drop proc Proc3
四、存储过程的种类
1.SQL Server提供的存储过程
SQL Server提供了很多现成的、实用的存储过程供用户使用。
常用的存储过程分为5类:
系统存储过程(sp_)
扩展存储过程(xp_)
远程存储过程
局部存储过程
临时存储过程
⑴系统存储过程(sp_)
SQL Server系统存储过程是为管理员而提供的,
SQL Server安装时在master数据库中创建并由系统管理员拥有。
使用户可以很容易地从系统表中取出信息,管理数据库,并执行
涉及更新系统表的其他任务。系统存储过程命令均以sp_打头,
其作用进行数据库管理。
SQL Server提供了许多系统存储过程以方便检索和操纵存放
在系统表中的信息,系统存储过程可以在任意一个数据库中执行。
例如,常用的系统存储过程有:
⑵ 扩展存储过程(xp_)
扩展存储过程提供一种类似于存储过程的方式,它们是动态装入和执行的动态
连接库(DLL)内的函数,无缝地扩展SQL Server功能。SQL Serve之外的动作可以
很容易地触发,外部信息返回到SQL Server。另外,扩展存储过程支持返回状态码和输出。
注意:必须从master数据库执行扩展存储过程。
用户可以创建自己的扩展存储过程。
例如,下面是一些的扩展存储过程:
⑶ 远程存储过程
远程存储过程是从连接到不同服务器的远程服务器或客户机调用的存储过程。
⑷ 局部存储过程
局部存储过程在各个用户数据库中创建。只能由创建它的用户调用。
⑸ 临时存储过程
临时存储过程可是局部的,名字前的前缀是"#";也可是全局的,名字前的前缀是"##"。
临时存储过程存放在tempdb数据库中。
局部临时存储过程在单个用户会话中使用,该用户退出时,自动被删除。
全局临时存储过程所有用户都可以使用,当最后一个用户退出时,自动被删除。