SQL Server中在存储过程中使用游标修改表中数据

时间:2021-03-21 22:28:54

首先,需要创建两张表attendance表和wages表

create table wages(
Eno varchar(20),--员工号
Basewage double,--基本工资
Overtimewage double,--加班工资
Deductwage double,--扣除工资
Bonuswage double,--奖金
Txyjwage double,--五险一金
Totalwage double--实发工资

)

create table attendance(
Eno varchar(20),--员工号
late int,--迟到早退小时数
overtime int,--加班小时数
leave int,--请假小时数
m_late int,--迟到每小时扣款
m_over int,--加班每小时金额
m_leave int--请假每小时扣款
)

现在要创建一个存储过程计算所有员工的实发工资,那么需要在该存储过程中声明一个游标,遍历attendance表中的每条记录,将数据取出,并计算对应员工的各类工资,并修改wages表

create procedure calcuwage    --存储过程里面放置游标
as
begin

declare UpdateWageCursor cursor --声明一个游标,查询出勤表的数据
for select
Eno,late,overtime,leave,m_late,m_over,m_leave
from attendance


open UpdateWageCursor --打开

--声明多个变量,用于读取游标中的值
--以下各个字段应与attendance表中相应字段的数据类型相同
declare
@Eno varchar(20),
@late int,
@overtime int,
@leave int,
@m_late int,
@m_over int,
@m_leave int


--将出勤表数据逐条放到变量中
fetch next from UpdateWageCursor into
@Eno,
@late,
@overtime,
@leave,
@m_late,
@m_over,
@m_leave


while @@fetch_status=0 --循环读取
begin

--根据员工号更新wages表的字段
update wages
set Overtimewage = @overtime * @m_over,
Deductwage = @late * @m_late + @leave * @m_leave,
Totalwage = Basewage + @overtime * @m_over - @late * @m_late + @leave * @m_leave + Bonuswage - Txyjwage
where Eno = @Eno;

fetch next from UpdateWageCursor into
@Eno,
@late,
@overtime,
@leave,
@m_late,
@m_over,
@m_leave

end

close UpdateWageCursor; --关闭

--deallocate UpdateWageCursor; --删除

end

--exec UpdateWageCursor;--执行存储过程