实验八(上):SQL Server用户自定义函数和触发器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八(上)用户自定义函数和触发器

一、实验目的

1、掌握SQLServer中用户自定义函数的使用方法。

2、掌握SQL Server中触发器的使用方法。

二、实验内容和要求

1.创建一个返回标量值的用户定义函数RectangleArea:输入矩形的长和宽就能计算

矩形的面积。自选2种实例调用该函数。

create function RectangleArea(@a int,@b int)returns int

as

begin

return @a*@b

end

declare @area int

execute @area=RectangleArea 3,5

print('矩形面积是:')

print @area

declare @area int

execute @area=RectangleArea 7,8

print('矩形面积是:')

print @area

2.创建一个用户自定义函数(内嵌表值函数),功能为产生某个系的学生选修信息,

内容为学号,姓名,课程名,成绩。调用这个函数,显示信息系有选课学生的信息。create function Search (@sdept char(10))returns table

as

return(

select sc.sno 学号,student.sname 姓名,ame 课程名,sc.grade 成绩,

student.sdept 系别from sc,student,course where o=o and

sc.sno = student.sno and sdept=@sdept

)

select*from Search('cs')

3.创建一个作用在P表上的触发器P_checks,确保用户在插入或更新P表的WEIGHT

值时,所提供的WEIGHT值介于20与40之间,否则给出错误提示并回滚此操作。

请测试该触发器,测试方法自定。

create trigger P_checks on p for insert

as

begin

declare @weight int

select @weight=weight from inserted

if @weight<10 or @weight>20

begin

RAISERROR('weight 必须在~20之间!',16,1)

ROLLBACK TRANSACTION

end

end

insert into p(pno,pname,color,weight)values('p7','刀片','红',40)

insert into p(pno,pname,color,weight)values('p7','刀片','红',15)

select*from p

4.创建一个作用在J表上的触发器J_Update,禁止同时修改项目的名称和所在城市,

并进行相应的错误提示。请测试该触发器。测试方法自定。

create trigger J_Update on j for update

as

begin

declare @jname1 char(10),@city1 char(10),@jname2 char(10),@city2 char(10)

select @jname1=jname,@city1= city from inserted

select @jname2=jname,@city2= city from deleted

if @jname1<>@jname2 and @city1<>@city2

begin

RAISERROR('不能同时修改项目名称和项目地点!',16,1)

ROLLBACK TRANSACTION

end

end

update j set jname='建筑',city='上海'where jno='j1'

update j set jname='建筑'where jno='j1'

select*from j

5.学生表(Student)中存放学生的记录,学生选修表(SC) 中存放学生的修课及成绩

情况。创建一个触发器ScDel_Cascade,当删除Student中的数据时,数据表SC中有关刚刚删除学生的修课成绩信息也能被级联删除掉。测试该触发器,测试方法自定。

create trigger ScDel_Cascade on student for delete

as

begin

declare @sno char(10)

select @sno=sno from deleted

delete from sc where sno=@sno

end

delete from student where sname='李勇'

select*from sc

select*from student

附加题:

创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。调用这个函数,生成相应的报表并给用户浏览。(多语句表值函数)

显示形式如下:

Cno Cname SC_number Max_grade Min_grade Average_grade

---- -------------------- --------- --------- --------- --------------

1 数据库 3 9

2 92 92.0

2 数学 2 85 80 82.0

3 信息系统 1 88 88 88.0

4 操作系统 1 NULL NULL NULL

5 数据结构 1 NULL NULL NULL

6 数据处理 2 55 55 55.0

7 PASCAL语言 1 NULL NULL NULL

(7 行受影响)

select*from sc,student,course where o =o and student.sno =sc.sno

create function studentgrade()returns table

as

return(

select o Cno,ame Cname,count(sc.sno) SC_number,

max(sc.grade)Max_grade,min(sc.grade)Min_grade,avg(sc.grade)Average_grade from sc,student,course where sc.sno = student.sno and

o = o group by o,ame

)

select*from studentgrade()

三、实验报告

相关文档
最新文档