自定义函数和存储过程


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
原文地址:https://www.cnblogs.com/liuwenhan/p/11834106.html