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

首先,需要创建两张表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;--执行存储过程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值