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