用企业管理器创建存储过程stu_proc1,要求能从学生表查询学号为102的学生信息。在企业管理器中,展开数据库teachdb,
右键单击结点“存储过程”,选择“新建存储过程”,弹出图6-2-1。在文本框中输入存储过程的内容后如图6-2-2,单击“检查
语法”正确后,单击“确定”即可创建名为stu_proc1的存储过程。
![]()
图6-2-1

图6-2-2
查看stu_proc1存储过程运行的结果,可以通过在查询分析器中运行exec stu_proc1来完成,如图6-2-3。

图6-2-3
查看stu_proc1存储过程的内容,可能通过exec sp_helptext stu_proc1来完成,如图6-2-4。

图6-2-4
二、用查询分析器创建存储过程。
要查询的学号通过执行语句中的输入参数传递给存储过程stu_proc2。打开查询分析器,输入以下内容执行后结果如图6-2-5:
use teachdbcreate proc stu_proc2
@sno char(4)/*定义参数及类型*/
as
select * from student where s_no=@sno

图6-2-5
创建存储过程的语法:
CREATE? PROC[EDURE] 存储过程名[;下标 ] /*定义过程名*/[{@ 形参? 数据类型 } /*定义参数及类型*/
[VARYING][= 默认值 ][OUTPUT]] /*定义参数的属性*/ [,...n1]
[WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
AS Transact-SQL 语句[...n2 ] /*执行的操作*/
三、使用不带参数的存储过程。
创建一个查询teachdb数据库中各位同学各门功课成绩的存储过程stu_grade。并要求加密文本条目,如果该存储过程已经存
在,则先删除后再重新创建。程序清单:
USE teachdbIF EXISTS (SELECT name FROM sysobjects WHERE name='stu_grade'and type='P')
DROP PROCEDURE stu_grade/*IF语句检查是否已存在同名的存储过程。若已存在,则先删除,然后再执行CREATE语句*/
GO
CREATE PROCEDURE stu_grade
WITH ENCRYPTION/*将存储过程的文本进行加密,运行后使用系统存储过程sp_helptext无法看到所定义的存储过程文本*/
AS SELECT s_name AS 姓名,c_name AS 课程名,score AS 成绩
FROM choice,course,student
WHERE student.s_no=choice.s_no and course.c_no=choice.c_no
四、使用带有通配符参数的存储过程
创建存储过程stu_proc3,用于从三个表的连接中返回指定学生的学号、姓名、所选课程名称、学分及该课程的成绩。该存储
过程在参数中使用了模式匹配。程序清单如下:
USE teachdbIF EXISTS (SELECT name FROM sysobjects WHERE name='stu_proc3' AND type='P')
DROP PROCEDURE stu_proc3
GO
CREATE PROCEDURE stu_proc3 @name varchar(30)
AS
SELECT student.s_no as 学号,student.s_name AS 姓名,course.c_name AS 课程名,course.c_score AS 学分,
choice.score AS 成绩 FROM student,course,choice
WHERE student.s_name LIKE @name and student.s_no=choice.s_no and course.c_no=choice.c_no
GO
stu_proc3存储过程也可以有多种执行形式,下面列出了一部分:
EXECUTE stu_proc3 '李%'/*传递给@name的实参为'李%'*/
通过查询分析器运行,结果如图6-2-6所示。

图6-2-6 EXECUTE stu_proc3 '[王李]%'
通过查询分析器运行,结果如图6-2-7所示。

图6-2-7 EXECUTE stu_proc3 '%'
通过查询分析器运行,结果如图6-2-8所示。

图6-2-8 EXECUTE stu_proc3
通过查询分析器运行,由于未提供实参,运行出错。结果如图6-2-9所示。

图6-2-9
五、带输出(OUTPUT)参数的存储过程
创建一用于计算指定学生成绩总分的存储过程。该存储过程中使用了一个输入参数和一个输出参数。
USE teachdbIF EXISTS (SELECT name FROM sysobjects WHERE name= 'stu_proc4' and type='P')
DROP PROCEDURE stu_proc4
GO
CREATE PROCEDURE stu_proc4
@name varchar(40),@total float OUTPUT
AS
SELECT @total=SUM(choice.score) FROM student,course,choice
WHERE student.s_name=@name and student.s_no=choice.s_no and course.c_no=choice.c_no
GROUP BY student.s_no
为了在运行该存储过程时能接收输出参数返回的值,需要用一个局部变量作为实参传递,并要加上OUTPUT关键字。在查询分
析器中使用以下语句运行存储过程stu_proc4。
DECLARE @totalA floatEXECUTE stu_proc4 '袁敏', @totalA OUTPUT /*OUTPUT变量必须在定义存储过程和使用该存储过程时都进行定义*/ PRINT '袁敏的总分为:' +CAST (@totalA AS char)
GO
通过查询分析器运行,结果如图6-2-10所示。

图6-2-10
