通过SQL命令创建和执行存储过程

步骤如下:

(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:表示可以指定多个存储过程同时删除。


你可能感兴趣的:(sql,存储过程)