1 --例8.2.1创建自定义标量函数TOTAL()用来计算任意两数之和。 2 create function total(@a int, @b int) 3 returns int 4 begin 5 declare @c int 6 select @c = @a + @b 7 return @c 8 end 9 --调用 10 select dbo.total(10, 20) 11 --例8.2.2编写一个函数,可以通过输入借书时间来判断是否到期,当借阅时间大于30天,返回已经过期;否则返回还未到期。 12 alter function isdateout(@a datetime) 13 returns varchar(20) 14 as 15 begin 16 declare @res varchar(20) 17 if (datediff(day, @a, getdate()) > 30) 18 set @res = '已过期' 19 else 20 set @res = '未到期' 21 return @res 22 end 23 --调用 24 select dbo.isdateout('2019-11-1') 25 --例8.2.3 创建标量函数sumstudent()统计选课学生总数。 26 create function cal() 27 returns int 28 begin 29 return (select count(distinct cno) from course) 30 end 31 --调用 32 print dbo.cal() 33 --例8.2.4 求选课表中某门课的平均成绩。 34 create function calavg(@cname char(4)) 35 returns float 36 as 37 begin 38 declare @res float 39 select @res = avg(grade) 40 from sc, course 41 where sc.cno = course.cno and course.cname = @cname 42 return @res 43 end 44 --调用 45 select dbo.calavg('英语') as 英语的平均成绩 46 --例8.2.5 创建函数fun_table( )返回一组查询的结果。 47 create function fun_table(@sno char(9), @grade int) 48 returns table 49 as 50 return 51 ( 52 select * 53 from sc 54 where sno = @sno and grade > @grade 55 ) 56 --调用 57 select * 58 from dbo.fun_table('200515001', 80) 59 --例8.2.6 查询某个专业所有学生的学号、姓名、所选课程的课程号和成绩。 60 alter function show(@major char(10)) 61 returns table 62 as 63 return 64 ( 65 select student.sno 学号, sname 姓名, cno 课程号, grade 成绩 66 from student, sc 67 where student.sno = sc.sno and sdept = @major 68 ) 69 70 select * 71 from dbo.show('cs') 72 --例8.2.7 查询计算机专业所有学生的学号、姓名、所选的课程号和成绩。 73 update dbo.show('cs') 74 set 姓名 = '张力' 75 where 学号 = '2005150033' 76 --????违反了 PRIMARY KEY 约束“PK_student”。不能在对象“dbo.student”中插入重复键。重复键值为 (200515001)。 77 --例8.2.8 创建函数fun_multi_table( )返回一个临时表。 78 create function fun_multi_table() 79 returns @tmp_table table(学号 char(9), 课程名 varchar(20), 成绩 int) 80 as 81 begin 82 insert @tmp_table 83 select sno, cname, grade 84 from sc, course 85 where sc.cno = course.cno 86 return 87 end 88 select * 89 from dbo.fun_multi_table() 90 --例8.2.9 创建多语句表值函数,通过学号作为实参调用该函数,可显示该学生的姓名以及各门功课的成绩和学分。 91 create function st_score(@no char(9)) 92 returns @score table(sno char(9), sname char(10), cname char(10), score int, credit int) 93 as 94 begin 95 insert @score 96 select s.sno, s.sname, c.cname, c.credit, sc.grade 97 from student s, course c, sc 98 where s.sno = sc.sno and c.cno = sc.cno and s.sno = @no 99 return 100 end 101 --调用 102 select * 103 from st_score('200515001')
1 --例8.3.1 带有复杂 SELECT 语句的存储过程:查询计算机系学生的考试情况,列出学生的姓名、课程名和考试成绩。 2 create procedure p_grade1 3 as 4 select sname, cname, grade 5 from student, course, sc 6 where student.sno = sc.sno and course.cno = sc.cno and sdept = 'cs' 7 8 exec p_grade1 9 --例8.3.2 带有输入参数的存储过程:查询某个指定系学生的考试情况,列出学生的姓名、所在系、课程名和考试成绩。 10 create procedure p_grade2 @dept varchar(20) 11 as 12 select sname, sdept, cname, grade 13 from student s, sc, course c 14 where s.sno = sc.sno and c.cno = sc.cno and sdept = @dept 15 16 exec p_grade2 'is' 17 --例8.3.3 含多个输入参数并有默认值的存储过程:查询某个学生某门课程的考试成绩,若没有指定课程,则默认课程为“数据库” 18 create procedure p_grade3 @sname varchar(10), @cname varchar(10) = '数据库' 19 as 20 select sname, cname, grade 21 from student s, course c, sc 22 where s.sno = sc.sno and c.cno = sc.cno and s.sname = @sname and c.cname = @cname 23 24 exec p_grade3 '赵菁菁', '数据结构' 25 --例8.3.4含多个输入参数并均指定默认值的存储过程。查询指定系、指定性别的学生中年龄大于等于指定年龄的学生详细信息。系的默认值为“计算机系”,性别默认值为“男”,年龄默认值为20。 26 create procedure p_student @dept char(20) = 'cs', @sex char(2) = '男', @age int = 20 27 as 28 select * 29 from student 30 where sdept = @dept and ssex = @sex and sage >= @age 31 32 exec p_student 'is', 10 33 exec p_student @dept = 'is', @sex = '女' 34 --例8.3.5含输出参数的存储过程。计算两个数的乘积,将计算结果用输出参数返回给调用者。 35 create procedure p_sum @var1 int, @var2 int, @var3 int output 36 as 37 set @var3 = @var1 * @var2 38 39 declare @res int 40 exec p_sum 5, 9, @res output 41 print @res 42 --例8.3.6 含输入参数和一个输出参数的存储过程。统计指定课程(课程名)的平均成绩,并将统计的结果用输出参数返回。 43 alter procedure p_avggrade @cname char(20), @avg float output 44 as 45 select @avg = avg(grade) 46 from sc join course c on c.cno = sc.cno 47 where c.cname = @cname 48 49 declare @avg_grade float 50 exec p_avggrade '数据库', @avg_grade output 51 print @avg_grade 52 --例8.3.7 含输入参数和多个输出参数的存储过程。统计指定课程的平均成绩和选课人数,将统计的结果用输出参数返回。 53 create procedure p_avgcount @cname varchar(10), @avg float output, @number int output 54 as 55 select @avg = avg(grade), @number = count(*) 56 from sc, course c 57 where sc.cno = c.cno and cname = @cname 58 59 declare @avg float, @number int 60 exec p_avgcount '数据结构', @avg output, @number output 61 select @avg as 平均成绩, @number as 选课人数 62 --例8.3.8 将指定课程的学分增加2分。 63 create procedure p_updatecredit1 @cname char(10) 64 as 65 update course 66 set credit = credit + 2 67 where cname = @cname 68 69 exec p_updatecredit1 '操作系统' 70 --例8.3.9 将指定课程的学分改为指定值,要求指定值必须在1~10之间,否则不予修改。 71 create procedure p_updatecredit2 @cno char(6), @credit int 72 as 73 if @credit between 1 and 10 74 update course 75 set credit = @credit 76 where cno = @cno 77 78 exec p_updatecredit2 1, 9 79 --例8.3.10 修改p_grade2存储过程,使其能查询指定系中考试成绩大于等于80分的学生姓名、所在系、课程名和考试成绩。 80 alter procedure p_grade2 @dept varchar(20) 81 as 82 select sname, sdept, cname, grade 83 from student s, course c, sc 84 where s.sno = sc.sno and c.cno = sc.cno and sdept = @dept and grade >= 80 85 86 exec p_grade2 'is' 87 --删除存储过程 88 drop procedure p_grade2