SQL Server存储过程

--存储过程

/*
存储过程(procedure)类似于Java语言的方法
用来执行管理任务或复杂的业务逻辑,方便调用
存储过程也分有参无参,有返回值无返回值
*/

--常用的系统存储过程

---列出当前系统中的数据库
exec sp_databases
---修改数据库的名称(单用户访问)
exec sp_renamedb 'school','university'
---返回某个表列的信息
use student
go
exec sp_tables
exec sp_columns stuInfo
---查看表stuInfo的信息
exec sp_help stuInfo
---查看表stuInfo的约束
exec sp_helpconstraint stuInfo
---查看表stuInfo的索引
exec sp_helpindex stuInfo
---查看视图的语句文本
exec sp_helptext '视图名'
---查看当前数据库中的存储过程
exec sp_stored_procedures
go


--例题:请创建存储过程,查看本次考试平均分以及未通过考试的学员名单
--创建不带输入参数的存储过程
create procedure pro_stu
as
	declare @avgwritten float,@avglab float--声明变量,笔试平均成绩和机试平均成绩
	select @avgwritten=avg(writtenExam),@avglab=avg(labExam) from stuScore--赋值
	print '笔试平均分:'+convert(nvarchar(4),@avgwritten)
	print '机试平均分:'+convert(nvarchar(4),@avglab)
	if(@avgwritten>80 and @avglab>80)
		begin
			print '本班考试成绩:优秀'
		end
	else
		begin
			print '本班考试成绩:较差'
		end
	print '---参加本次考试没有通过的学员---'
	select * from stuInfo where stuNo in(select stuNo from stuScore where writtenExam<80 or labExam<80)
go
--执行存储过程
exec pro_stu

--创建带输入参数的存储过程
create procedure pro_stu1
@writtenpass int,@labpass int
as
	declare @avgwritten float,@avglab float--声明变量,笔试平均成绩和机试平均成绩
	select @avgwritten=avg(writtenExam),@avglab=avg(labExam) from stuScore--赋值
	print '笔试平均分:'+convert(nvarchar(4),@avgwritten)
	print '机试平均分:'+convert(nvarchar(4),@avglab)
	if(@avgwritten>80 and @avglab>80)
		begin
			print '本班考试成绩:优秀'
		end
	else
		begin
			print '本班考试成绩:较差'
		end
	print '---参加本次考试没有通过的学员---'
	select * from stuInfo where stuNo in(select stuNo from stuScore where writtenExam<@writtenpass or labExam<@labpass)
go
exec pro_stu1 90,90
exec Pro_stu1 80,85

--创建为输入参数设置默认值的存储过程
create procedure pro_stu2
@writtenpass int=90,@labpass int=90
as
	declare @avgwritten float,@avglab float--声明变量,笔试平均成绩和机试平均成绩
	select @avgwritten=avg(writtenExam),@avglab=avg(labExam) from stuScore--赋值
	print '笔试平均分:'+convert(nvarchar(4),@avgwritten)
	print '机试平均分:'+convert(nvarchar(4),@avglab)
	if(@avgwritten>80 and @avglab>80)
		begin
			print '本班考试成绩:优秀'
		end
	else
		begin
			print '本班考试成绩:较差'
		end
	print '---参加本次考试没有通过的学员---'
	select * from stuInfo where stuNo in(select stuNo from stuScore where writtenExam<@writtenpass or labExam<@labpass)
go
--输入参数为默认值
exec pro_stu2
--为输入参数设值
exec pro_stu2 80,80
exec pro_stu2 80--为第一个参数赋值
exec Pro_stu2 @labpass=85--指定参数赋值

--带输出参数的存储过程
create procedure pro_stu3
@notpasssum int output,--输出参数
@writtenpass int=90,@labpass int=90--输入参数(推荐将输入参数放在输出参数后面)
as
	declare @avgwritten float,@avglab float--声明变量,笔试平均成绩和机试平均成绩
	select @avgwritten=avg(writtenExam),@avglab=avg(labExam) from stuScore--赋值
	print '笔试平均分:'+convert(nvarchar(4),@avgwritten)
	print '机试平均分:'+convert(nvarchar(4),@avglab)
	if(@avgwritten>80 and @avglab>80)
		begin
			print '本班考试成绩:优秀'
		end
	else
		begin
			print '本班考试成绩:较差'
		end
	print '---参加本次考试没有通过的学员人数---'
	select @notpasssum=count(stuNo) from stuInfo 
	where stuNo in(select stuNo from stuScore where writtenExam<@writtenpass or labExam<@labpass)
	
go
--声明变量@sum,并将输出参数赋给@sum,类似Java中声明变量接收返回值
declare @sum int
exec pro_stu3 @sum output
IF @sum>=3
  print '未通过人数:'+convert(varchar(5),@sum)+ '人, 
        超过60%,及格分数线还应下调'
ELSE
  print '未通过人数:'+convert(varchar(5),@sum)+ '人,
        已控制在60%以下,及格分数线适中'
GO 



--使用raiserror语句
/*
RAISERROR (msg_id | msg_str,severity,
   state WITH option[,...n]]) 
msg_id:在sysmessages系统表中指定用户定义错误信息
msg_str:用户定义的特定信息,最长255个字符
severity:定义严重性级别。用户可使用的级别为0–18级
state:表示错误的状态,1至127之间的值
option:指示是否将错误记录到服务器错误日志中 

*/
--例题:完善上例,当用户调用存储过程时,传入的及格线参数不
--在0~100之间时,将弹出错误警告,终止存储过程的执行。
CREATE PROCEDURE pro_stu4 
  @notpassSum int OUTPUT, --输出参数
  @writtenPass int=85,  --默认参数放后
  @labPass int=85       --默认参数放后
  AS
    IF (NOT @writtenPass BETWEEN 0 AND 100) 
             OR (NOT @labPass BETWEEN 0 AND 100)
       BEGIN
         RAISERROR ('及格线错误,请指定0-100之间的分 
                     数,统计中断退出',16,1)
         RETURN  ---立即返回,退出存储过程
       END
    Else
       BEGIN
		 print '---参加本次考试没有通过的学员人数---'
	     select @notpasssum=count(stuNo) from stuInfo 
	     where stuNo in(select stuNo from stuScore where writtenExam<@writtenpass or labExam<@labpass)
       END
       
GO 

/*---调用存储过程,测试RAISERROR语句----*/
DECLARE @sum int,  @t int
EXEC pro_stu4 @sum OUTPUT ,604   
SET @t=@@ERROR 
print  '错误号:'+convert(varchar(5),@t )
IF @t<>0  
   RETURN  --退出批处理,后续语句不再执行
print '--------------------------------------------------'
IF @sum>=3
  print '未通过人数:'+convert(varchar(5),@sum)+ '人,超过60%,及格分数线还应下调'
ELSE
  print '未通过人数:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分数线适中'
GO

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值