sql server实验指导 sql server实验指导第四版

您所在的位置:网站首页 sqlserver实验指导第4版 sql server实验指导 sql server实验指导第四版

sql server实验指导 sql server实验指导第四版

2024-07-15 14:55| 来源: 网络整理| 查看: 265

前言:最近挺忙,一直没做。。当然还因为不会,这部分光看书不容易学明白,建议多上网查资料,实验代码基本都是参考搬运的,惭愧。。(新消息:考试不要求,这不是让我心安理得地借鉴嘛)

目的: 1.掌握事务的概念、性质、定义及使用;

2.掌握游标的概念、组成、创建及使用;

3.掌握存储过程的概念、类型、特点、创建、执行及管理。

4.掌握触发器的概念、创建、管理及使用。

文章目录@[toc]**实验内容**事务游标存储过程触发器参考实验内容事务

1.进行如下事务处理练习(把下列五条语句作为一个事务处理,只有五条语句全部成功执行才做提交,并给出成功的提示信息;否则就做回退处理,并给出具体的错误提示信息):

insert into 成本表 values(‘zy2021006’,‘112202002’,‘y005’,

10000,‘张三’, ‘07-01-2021’ ,‘07-04-2021’,‘07-25-2021’,

‘作业公司作业一队’,‘堵漏’,7000,2500,1000,1400,11900,

‘李四’,‘07-26-2021’,11900,‘王五’,‘07-28-2021’)

insert into材料消耗表values(‘zy2021006’,‘wm001’,200)

insert into材料消耗表values(‘zy2021006’,‘wm002’,200)

insert into材料消耗表values(‘zy2021006’,‘wm003’,200)

insert into材料消耗表values(‘zy2021006’,‘wm004’,100)

insert into 成本 values('zy2021006','112202002','y005', 10000,'张三', '07-01-2021' ,'07-04-2021','07-25-2021', '作业公司作业一队','堵漏',7000,2500,1000,1400,11900, '李四','07-26-2021',11900,'王五','07-28-2021') insert into 材料消耗 values('zy2021006','wm001',200) insert into 材料消耗 values('zy2021006','wm002',200) insert into 材料消耗 values('zy2021006','wm003',200) insert into 材料消耗 values('zy2021006','wm004',100) if @@ERROR0 -- @@ERROR:当前一个语句遇到错误,则返回错误号,否则返回0 begin print('语句执行失败') rollback end -- 不加begin、end有语法错误 else begin print('语句执行成功') commit end

执行结果如下:

sql server实验指导 sql server实验指导第四版_存储过程

sql server实验指导 sql server实验指导第四版_触发器_02

试将其中一个zy2021006改为2021009,会发现提示语句执行失败,材料消耗表无变化

游标

2.进行如下游标练习:

定义一个游标,用于存放成本表的全部行数据,并打印以下表头和各行数据。

表头:单据号 预算单位 井号 预算金额 预算人 预算日期 开工日期 完工日期 施工单位 施工内容 材料费 人工费 设备费 其它费用 结算金额 结算人 结算日期 入账金额 入账人 入账日期

执行以上所定义的游标,查看是否能正确输出结果。

begin transaction declare yb cursor for -- 定义游标 select * from 成本 open yb -- 打开游标 declare @单据号 varchar(20) -- 定义局部变量 declare @预算单位 varchar(20) declare @井号 varchar(20) declare @预算金额 varchar(20) declare @预算人 varchar(20) declare @预算日期 varchar(20) declare @开工日期 varchar(20) declare @完工日期 varchar(20) declare @施工单位 varchar(20) declare @施工内容 varchar(20) declare @材料费 varchar(20) declare @人工费 varchar(20) declare @设备费 varchar(20) declare @其他费用 varchar(20) declare @结算金额 varchar(20) declare @结算人 varchar(20) declare @结算日期 varchar(20) declare @入账金额 varchar(20) declare @入账人 varchar(20) declare @入账日期 varchar(20) -- 打印表头 print '单据号 '+'预算单位 '+'井号 '+'预算金额 '+'预算人 '+'预算日期 '+'开工日期 '+'完工日期 '+'施工单位 '+'施工内容 '+'材料费 '+'人工费 '+ '设备费 '+'其他费用 '+'结算金额 '+'结算人 '+'结算日期 '+'入账金额 '+'入账人 '+'入账日期' fetch next from yb into @单据号, @预算单位, @井号, @预算金额, @预算人, @预算日期, @开工日期, @完工日期, @施工单位, @施工内容, @材料费, @人工费, @设备费, @其他费用, @结算金额, @结算人, @结算日期, @入账金额, @入账人, @入账日期 while(@@fetch_status = 0) begin print @单据号+' '+ @预算单位+' '+ @井号+' '+ @预算金额+' '+ @预算人+' '+ @预算日期+' '+ @开工日期+' '+ @完工日期+' '+ @施工单位+' '+ @施工内容+' '+ @材料费+' '+ @人工费+' '+ @设备费+' '+ @其他费用+' '+ @结算金额+' '+ @结算人+' '+ @结算日期+' '+ @入账金额+' '+ @入账人+' '+ @入账日期 fetch next from yb into @单据号, @预算单位, @井号, @预算金额, @预算人, @预算日期, @开工日期, @完工日期, @施工单位, @施工内容, @材料费, @人工费, @设备费, @其他费用, @结算金额, @结算人, @结算日期, @入账金额, @入账人, @入账日期 end close yb存储过程

3.定义一个存储过程,要求完成以下功能:

生成某单位(单位可以是采油厂或采油矿或采油队)某段时间内的成本运行情况(输入参数:单位代码 起始日期 结束日期)。

输出格式 单位时间时间成本运行情况

预算金额 结算金额 入账金额 未结算金额 未入账金额

其中:未结算金额=预算金额-结算金额

未入账金额=结算金额-入账金额

分三种情况(单位分别为:采油厂、采油矿、采油队)执行以上定义的存储过程,查看执行输出结果。

if object_id('_someDepCost','p') is not null drop procedure _someDepCost; go create procedure _someDepCost @单位代码 varchar(40), @起始日期 datetime, @结束日期 datetime as declare @单位名称 varchar(40); declare @预算金额 money, @结算金额 money, @入账金额 money, @未结算金额 money, @未入账金额 money; select @单位名称 = 单位名称 from 单位 where 单位代码 = @单位代码 set @预算金额 = (select sum(预算金额) from 成本 where 预算单位 like @单位代码 + '%' and (预算日期 between @起始日期 and @结束日期)) set @结算金额 = (select sum(结算金额) from 成本 where 预算单位 like @单位代码 + '%' and (结算日期 between @起始日期 and @结束日期)) set @入账金额 = (select sum(入账金额) from 成本 where 预算单位 like @单位代码 + '%' and (入账日期 between @起始日期 and @结束日期) and (入账金额 is not null)) set @未结算金额 = (select sum(预算金额) from 成本 where (结算金额 is null) and (预算日期 between @起始日期 and @结束日期)) set @未入账金额 = (select sum(结算金额) from 成本 where (入账金额 is null) and (结算日期 between @起始日期 and @结束日期)) set @未结算金额 = @预算金额 - @结算金额 set @未入账金额 = @结算金额 - @入账金额 if @预算金额 is null set @预算金额 = 0 if @结算金额 is null set @结算金额 = 0 if @入账金额 is null set @入账金额 = 0 if @未结算金额 is null set @未结算金额 = 0 if @未入账金额 is null set @未入账金额 = 0 declare @result varchar(100) set @result = convert(varchar,@预算金额)+' '+convert(varchar,@结算金额)+ ' '+convert(varchar,@入账金额)+' '+convert(varchar,@未结算金额)+' '+convert(varchar,@未入账金额) print @单位名称+'单位'+convert(varchar,@起始日期,102)+'--'+convert(varchar,@结束日期,102)+'成本运营状况' print '预算金额 结算金额 入账金额 未结算金额 未入账金额' print @result go execute _someDepCost @单位代码 = '1122',@起始日期 = '2016-5-1',@结束日期 = '2020-5-29'; execute _someDepCost @单位代码 = '112201',@起始日期 = '2020-5-1',@结束日期 = '2020-5-29'; execute _someDepCost @单位代码 = '112201001',@起始日期 = '2020-5-1',@结束日期 = '2020-5-29'; go

何为存储过程?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。(类似于函数,但实际两者不同)

在可编程性中可以查看定义的存储过程

sql server实验指导 sql server实验指导第四版_sql_03

触发器

4.针对成本表定义三个触发器,分别完成以下功能:

⑴ 对成本表插入一行数据时,自动计算并插入结算金额字段(结算金额=材料费+人工费+设备费+其它费用)。

⑵ 当修改成本表的某行数据时自动修改结算金额字段。

⑶ 当删除成本表中一行数据时,自动删除材料消耗表中相应明细数据。

⑷ 对上述3个触发器用适当的更新语句进行验证,并查看结果是否达到预期结果。

create trigger trmytr1 on 成本 after insert as declare @结算金额 money declare @temp1 money,@temp2 money,@temp3 money,@temp4 money; select @temp1 = 材料费,@temp2 = 人工费,@temp3 = 设备费,@temp4 = 其它费用 from inserted; set @结算金额 = @temp1+@temp2+@temp3+@temp4; update 成本 set 结算金额 = @结算金额 where 单据号 = (select 单据号 from inserted); -- 测试trmytr1 insert into 成本(单据号,预算人,材料费,人工费,设备费,其它费用) values('2017000','test',100,200,300,400); -- 删除测试内容 delete from 成本 where 单据号 = '2017000';create trigger trmytr2 on 成本 after update as declare @结算金额 money declare @temp1 money,@temp2 money,@temp3 money,@temp4 money; select @temp1 = 材料费,@temp2 = 人工费,@temp3 = 设备费,@temp4 = 其它费用 from inserted; set @结算金额 = @temp1+@temp2+@temp3+@temp4; update 成本 set 结算金额 = @结算金额 where 单据号 = (select 单据号 from inserted); -- 插入一行测试数据 insert into 成本(单据号,预算人,材料费,人工费,设备费,其它费用) values('2020111','test',100,200,300,400); -- 测试trmytr2 update 成本 set 材料费 = 100000 where 单据号 = '2017111';create trigger trmytr3 on 成本 instead of delete as delete from 材料消耗 where 单据号 = (select 单据号 from deleted); -- 插入测试数据 insert into 成本(单据号,预算人,材料费,人工费,设备费,其它费用) values('2020110','test',100,200,300,400); insert into 材料消耗 values('2020110','wm001',1); select 单据号,物码 from 材料消耗; delete from 成本 where 单据号 = '2020110'; select 单据号,物码 from 材料消耗


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3