实验六、存储过程

一、实验目的

(1)掌握T-SQL流控制语句。
(2)掌握创建存储过程的方法。
(3)掌握存储过程的执行方法。
(4)掌握存储过程的管理和维护。

二、实验内容

  1. 创建简单存储过程
    创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。

    if exists(select * from sysobjects where type = 'P' and name='stu_pr')
    begin
    	drop procedure stu_pr
    	print '已删除'
    end
    else
    	print '不存在,可创建!'
    go
    
    create procedure stu_pr
    as
    begin
    	select * from Student
    	left join SC on(SC.Sno=Student.Sno)
    	left join Course on(SC.Cno=Course.Cno)
    	where Classno='051'
    end
    go
    
  2. 创建带参数的存储过程
    (1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄、选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%” 与“林%”。执行该存储过程,用多种参数加以测试。

    if exists (select * from sysobjects where name='stu_proc1' and type='P')
    	drop procedure stu_proc1
    go
    create procedure stu_proc1
    	@sdept char(20)='%',@sname varchar(8)='林%'
    as
    	select Student.Sno 学号,Sname 姓名,year(getdate())-year(Birth) 年龄,Cname 课程名,Grade 成绩
    	from Student,Course,SC
    	where Student.Sno=SC.Sno and Course.Cno=SC.Cno
    		and Sdept like @sdept
    		and Sname like @sname
    go
    

    (2)创建一个名为student_sc的存储过程,可查询出某学号段的同学的学号、姓名、总成绩。(学号起始号与终止号在调用时输入,可设默认值。)执行该存储过程。

    if exists(select name from sysobjects where name='student_sc' and type='P')
    	drop procedure student_sc
    go
    create procedure student_sc
    	@startno char(8)='20110001',@endno char(8)='20110002'
    as 
    	select Student.Sno 学号, Sname 姓名,sum(Grade) 总成绩
    	from Student,SC
    	where Student.Sno=SC.Sno
    		and Student.Sno between @startno and @endno
    	group by Student.Sno,Sname
    go
    --执行存储过程
    execute student_sc;
    

    实验六、存储过程_第1张图片

  3. 创建带输出参数的存储过程
    (1)创建一个名为course_average的存储过程,可查询某门课程考试的平均成绩。总成绩可以输出,以便进一步调用。

    if exists(select name from sysobjects where name='course_average' and type='P')
    	drop procedure course_average
    go
    create procedure course_average
    	@cno varchar(20),@average int output,@sum int output
    as
    	select @average=avg(Grade),@sum=sum(Grade)
    	from SC
    	where Cno=@cno
    	group by Cno
    go
    --执行存储过程
    declare @averageGrade int,@sumGrade int
    execute course_average '001',@averageGrade output,@sumGrade output
    print '该门课程的平均成绩是: '+cast(@averageGrade as varchar(10))
    print '该门课程的总成绩是: ' +cast(@sumGrade as varchar(10))
    

    实验六、存储过程_第2张图片

    (2)创建一执行该存储过程的批处理,要求当平均成绩小于60时,显示信息为:“XX课程的平均成绩为:XX,其平均分未达60分”。超过60时,显示信息为:“XX课程的平均成绩为:XX”。

    declare @avg int,@sum int
    execute course_average '002',@avg output,@sum output
    if @avg<=60
    	print '002号课程的平均成绩为: '+cast(@avg as varchar(10))+',其平均分未达60分'
    else
    	print '002号课程的平均成绩为:'+cast(@avg as varchar(10))
    

    在这里插入图片描述

  4. 创建带重编译及加密选项的存储过程
    创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。(学号、课程号在调用时输入)

    if exists(select name from sysobjects where name='update_sc' and type='P')
    	drop procedure update_sc
    go
    create procedure update_sc
    	@sno varchar(8),@cno varchar(3),@grade tinyint
    	with recompile, encryption
    as 
    	update SC
    	set Grade=@grade
    	where Cno = @cno and Sno = @sno
    
    -- 执行存储过程
    execute update_sc '20110001','001',91;
    

    在这里插入图片描述

  5. 使用T-SQL语句管理和维护存储过程
    (1)使用sp_helptext查看存储过程student_sc的定义脚本。

    sp_helptext 'student_sc'
    

    在这里插入图片描述

    (2)使用select语句查看student_sc存储过程的定义脚本。

    select name,text from sysobjects,syscomments 
    where sysobjects.id=syscomments.id
    	and name='student_sc' and type='P';
    

    在这里插入图片描述

    (3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。

    alter procedure stu_pr
    as
    	select * from Student
    	left outer join SC on(SC.Sno=Student.Sno)
    	left outer join Course on (SC.Cno=Course.Cno)
    	where Student.Sno='20110001'
    

    实验六、存储过程_第3张图片

    (4)删除存储过程stu_pr。

    drop procedure stu_pr;
    
  6. 使用SQL Server Management Studio管理存储过程
    (1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_pr。

    create procedure stu_pr
    as
    begin
    	select * from Student
    	left join SC on(SC.Sno=Student.Sno)
    	left join Course on(SC.Cno=Course.Cno)
    	where Classno='051'
    end
    go
    

    (2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。

    alter procedure stu_pr
    as
    	select * from Student
    	left outer join SC on(SC.Sno=Student.Sno)
    	left outer join Course on (SC.Cno=Course.Cno)
    	where Classno='051' and Sex='女'
    

    实验六、存储过程_第4张图片

    (3)删除存储过程stu_pr。

    drop procedure stu_pr;
    

你可能感兴趣的:(SQL,Server,sql,数据库)