步骤如下:
(1) 定义如下存储过程
USE 数据库名 GO CREATE PROCEDURE 存储过程名 AS SELECT student.sno,sname,course.cno,cname,degree FROM student,score,course WHERE student.sno=score.sno AND score.cno=course.cno GO
(2) 调用存储过程
EXEC 存储过程名 GO
创建存储过程
语法格式:
CREATE PROC [ EDURE ] 存储过程名 [ ; number ] /*定义存储过程名*/ [ { @参数名 类型 } /*定义参数的类型*/ [ VARYING ] [ = default ] [ OUTPUT ] ] /*定义参数的属性*/ [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }] /*定义存储过程的处理方式*/ [ FOR REPLICATION ] AS sql_statements /*执行的操作*/
2) 存储过程的执行
通过EXEC命令可以执行一个已定义的存储过程。
语法格式:
[ EXEC [ UTE ] ] [ @return_status = ] { 存储过程名 [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } [ ,...n ]
例14.1 利用school数据库中的school表、score表和course表,编写一无参存储过程用于查询所有学生的选修课程成绩记录。
CREATE PROCEDURE a AS SELECT student.sno,sname,course.cno,cname,degree FROM student,score,course WHERE student.sno=score.sno AND score.cno=course.cno
执行:
EXEC a
例14.2 编写一存储过程,根据school数据库的student、score、course三个表查询指定学生的选修课程成绩情况。
CREATE PROCEDURE b @sno char(5) AS SELECT student.sno,sname,course.cno,cname,degree FROM student,score,course WHERE student.sno=score.sno AND score.cno=course.cno AND student.sno=@sno
执行:
EXEC b '101'
例14.3利用shool数据库中student表、score、course表创建一存储过程c,查询指定课程名的选修情况。该存储过程在参数中使用了模糊查询,如果没有提供参数,则使用预设的默认值。
CREATE PROCEDURE c @cname varchar(16)='%计算机%' AS SELECT student.sno,sname,course.cno,cname,degree FROM student,score,course WHERE student.sno=score.sno AND score.cno=course.cno AND cname LIKE @cname
EXEC c EXEC c '操作%' EXEC c '%计%'
例14.4编写一存储过程,统计指定课程选修人数,存储过程中使用了输入和输出参数。
CREATE PROCEDURE m @cname char(16),@num int output AS SELECT @num=COUNT(sno) FROM score,course WHERE score.cno=course.cno AND cname LIKE @cname
DECLARE @num int EXEC m '操作系统',@num output SELECT @num AS 借阅次数
例14.5 在school数据库的student表上声明并打开一个游标。
CREATE PROCEDURE student_cursor @student_cur CURSOR VARYING OUTPUT AS SET @student_cur=CURSOR FORWARD_ONLY STATIC FOR SELECT sno,sname,ssex,class FROM student OPEN @student_cur DECLARE @mycursor CURSOR EXEC student_cursor @student_cur=@mycursor OUTPUT FETCH NEXT FROM @mycursor WHILE @@FETCH_STATUS=0 FETCH NEXT FROM @mycursor CLOSE @mycursor DEALLOCATE @mycursor
例14.6 创建加密过程,使用sp_helptext系统存储过程获取关于加密的存储过程的信息。
CREATE PROCEDURE encryption_this WITH ENCRYPTION AS SELECT * FROM student EXEC sp_helptext 'encryption_this'
例14.7 创建存储过程sp_showtable,显示以student开头的所有表名及其对应的索引名。如果没有指定参数,该存储过程将返回以course开头的所有表名及对应的索引名。
CREATE PROCEDURE sp_showtable @table varchar(20)='course%' AS SELECT sysobjects.name,sysindexes.name FROM sysobjects,sysindexes WHERE sysobjects.id=sysindexes.id AND sysobjects.name LIKE @table AND indid<>0 AND indid<>255 EXEC sp_showtable EXEC sp_showtable 'student%'
如果确认一个数据库的某个存储过程与其它对象没有任何依赖关系,则可用DROP PROCEDURE语句永久地删除该存储过程。
语法格式:
DROP PROCEDURE { procedure } [ ,...n ]
功能:从当前数据库中删除一个或多个存储过程或存储过程组。
参数含义:
procedure指要删除的存储过程或存储过程组的名称;n:表示可以指定多个存储过程同时删除。