存储过程实验
测试实例
1.创建存储过程但是没有结果,也不抱错,检查变量的类型必须完全一致。
失败截图:
--创建存储过程s_info,根据学生的姓名和学号查询学生的年龄、所在系。
CREATE PROCEDURE s_info
@Sno char(9), --如果类型不一致,那就会导致没有结果的输出
@Sname char(20)
AS
print '--------------------------------------------------'
print ' 根据学生的姓名和学号查询学生的年龄、所在系:'
SELECT SDept,SName,SNo,
datediff(yy,SB,getdate()) AS DiffDate
FROM Student WHERE SNo=@Sno and SName=@Sname
GO
select * from Student;
DROP PROC s_info;
EXEC s_info @Sno=s02,@Sname=李想
成功截图:
2.创建存储过程s_default,根据学生的姓名和学号查询学生的年龄、所在系。
如果未提供学生的姓名和学号,该存储过程将显示学号为‘s01’,姓名为“王玲”的学生信息。
--创建存储过程s_default,根据学生的姓名和学号查询学生的年龄、所在系。
--如果未提供学生的姓名和学号,该存储过程将显示学号为‘s01’,姓名为“王玲”的学生信息。
CREATE PROCEDURE s_default
@Sno char(9),
@Sname char(20)
AS
print '--------------------------------------------------'
print ' 根据学生的姓名和学号查询学生的年龄、所在系:'
print ' 如果未提供,显示学号s01,姓名 王玲 的学生'
IF ( @Sno BETWEEN 's01' AND 's06') -- 范围
SELECT SDept,SName,SNo,
datediff(yy,SB,getdate()) AS DiffDate --年龄
FROM Student WHERE SNo=@Sno and SName=@Sname
ELSE
SELECT SDept,SName,SNo,
datediff(yy,SB,getdate()) AS DiffDate
FROM Student where SNo='s01' and SName='王玲'
GO
DROP PROC s_default;
EXEC s_default @Sno=s02,@Sname=李想
EXEC s_default @Sno=s10,@Sname=李二
3.创建存储过程s_nul,根据学生的姓名和学号查询学生选修的课程。
如果未提供生的姓名和学号,则显示提示信息“请输入学号和姓名!”。
CREATE PROCEDURE s_nul
@Sno char(9),
@Sname char(20)
AS
print '--------------------------------------------------'
print ' 根据学生的姓名和学号查询学生选修的课程:'
print ' 如果未提供,显示提示信息“请输入学号和姓名!'
IF ( @Sno = null or @Sname = null)
print '请输入学号和姓名!'
ELSE
SELECT SName,Course.CNo,CName as 课程
FROM Student,Course,SC
WHERE Student.SNo=@Sno --将几个表连在一起
and Student.SNo = SC.SNo
and SC.CNo=Course.CNo
GO
drop proc s_nul;
EXEC s_nul @Sno=s02,@Sname=李想
select * from Course;
select * from SC;
4创建存储过程s_count,根据课程名,检索选修某门课程的学生人数。
CREATE PROCEDURE s_count
@Cname char(9)
AS
print '--------------------------------------------------'
print ' 根据课程名,检索选修某门课程的学生人数:'
--统计Sno的个数
SELECT 课程名=CName, 学生选修人数=COUNT(distinct SNo)
FROM SC,Course
where SC.CNo= Course.CNo
AND Course.CName=@Cname
group by CName
order by CName
GO
drop proc s_count;
select * from Course;
select * from SC;
EXEC s_count @Cname='数据库'
5.创建存储过程sg,根据输入的学号和课程号,获得指定学号和课程号的课程成绩。
CREATE PROCEDURE sg
@SNo CHAR(9),
@CNo CHAR(4)
AS
--创建存储过程sg,根据输入的学号和课程号
--获得指定学号和课程号的课程成绩。
SELECT 学号=SNo, 课程号=CNo,成绩=Grade
FROM SC
where SC.CNo=@CNo
AND SC.SNo=@SNo
group by SNo,CNo,Grade --分组就类似输出的样子元组
order by SNo
GO
exec sg @SNo='s01',@CNo='c01'
6.创建存储过程update_s_1,修改指定学号的数据信息。
create proc update_s_1
@SNo CHAR(9),
@SName CHAR(20) ,
@SDept CHAR(20),
@SB datetime,
@SSex CHAR(2)
as
begin
update Student set SNo=@SNo,SName=@SName,SDept=@SDept,
SB=@SB,SSex=@SSex
where SNo=@SNo;
end
exec update_s_1 @SNo='s01',@SName='莉莉',@SDept='计算机',
@SB='2002-03-03 00:00:00.000',@SSex='女'
select * from Student;
修改后
总结
group by:分组显示的
存储过程的数据类型必须与建表的数据类型保持一致