您的位置:首页 > 数据库

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

2016-06-02 21:10 441 查看
首先,需要创建两张表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;--执行存储过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql sql server cursor