SQL server 游标使用,循环遍历表数据

记录下 第一次使用sql server 写存储。

一般在处理复杂的数据的时候,最好还是使用临时表把数据封装起来 再做各种的运算;

create table #issuesData(annualAppliedDays numeric(18, 1),annualBalanceDays numeric(18, 1),annualCarryForwardDays numeric(18, 1),requestNo varchar(50),submissionDate varchar(50),nodeId varchar(50),staffCode varchar(50),leaveDate numeric(18, 1),formeDate varchar(50),toDate varchar(50))  
    insert into #issuesData select 
(select annual_applied_days from teflow_leave_balance where staff_code = b.request_staff_code and [year] = 2019) as annualAppliedDays,
(select annual_balance_days from teflow_leave_balance where staff_code = b.request_staff_code and [year] = 2019) as annualBalanceDays,
(select annual_carry_forward_days from teflow_leave_balance where staff_code = b.request_staff_code and [year] = 2019) as annualCarryForwardDays,
a.request_no as requestNo,
b.Submission_date as submissionDate,
b.node_id as nodeId,
b.request_staff_code as staffCode,
a.field_02_12 as leaveDate,
a.field_02_3 as formeDate,
a.field_02_5 as toDate
from teflow_152_02 a 
	left join teflow_wkf_process b 
	on a.request_no = b.request_no
	where a.field_02_3 <= '2018-12-31 23:59:59'
	and a.field_02_8 like '%Annual Leave%'
	and b.node_id = -1
	and b.Submission_date > '2018-12-31 23:59:59'

以下是简单的使用游标循环操作表的例子

使用的sql server 数据库,其他的数据库语法上注意下就好



if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[issues_leave]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
	drop procedure [dbo].[issues_leave]

GO

CREATE proc [dbo].[issues_leave] 
as
begin
	declare 
	@annualAppliedDays numeric (18,1)= 0,
	@annualBalanceDays numeric (18,1)= 0,
	@annualCarryForwardDays numeric (18,1)= 0,
	
	@currentLeaveDays numeric (18,1)= 0,
	@staffCode varchar (30)
	
--drop table #issuesData

	begin
	--	select * from #issuesData
		--定义游标
	    declare order_cursor cursor for (select leaveDate,annualAppliedDays,annualBalanceDays,annualCarryForwardDays,staffCode from #issuesData)
	    --打开游标--
	    open order_cursor
	    --开始循环游标变量--
	    fetch next from order_cursor into @currentLeaveDays,@annualAppliedDays,@annualBalanceDays,@annualCarryForwardDays,@staffCode;
	    	if(@annualCarryForwardDays > 1)
	    	begin
		    	if(@annualAppliedDays = 0)--未休
		    	begin
					select @annualBalanceDays = @annualBalanceDays - 1
					select @annualCarryForwardDays = @annualCarryForwardDays - 1;
					update teflow_leave_balance set annual_carry_forward_days = @annualCarryForwardDays,annual_balance_days = @annualBalanceDays  where staff_code = @staffCode and [year] = 2019;
				end
				else if (@annualAppliedDays > 1) --已休 
				begin
					select @annualAppliedDays = @annualAppliedDays - 1
					select @annualCarryForwardDays = @annualCarryForwardDays - 1;
					update teflow_leave_balance set annual_carry_forward_days = @annualCarryForwardDays,annual_applied_days = @annualAppliedDays  where staff_code = @staffCode and [year] = 2019;
				end
			end
			else
			begin
				if(@annualAppliedDays = 0)--未休
		    	begin
					select @annualBalanceDays = @annualBalanceDays - 0.5
					select @annualCarryForwardDays = @annualCarryForwardDays - 0.5;
					update teflow_leave_balance set annual_carry_forward_days = @annualCarryForwardDays,annual_balance_days = @annualBalanceDays  where staff_code = @staffCode and [year] = 2019;
				end
				else if (@annualAppliedDays > 1) --已休 
				begin
					select @annualAppliedDays = @annualAppliedDays - 0.5
					select @annualCarryForwardDays = @annualCarryForwardDays - 0.5;
					update teflow_leave_balance set annual_carry_forward_days = @annualCarryForwardDays,annual_applied_days = @annualAppliedDays  where staff_code = @staffCode and [year] = 2019;
				end
			end
		fetch next from order_cursor into @currentLeaveDays,@annualAppliedDays,@annualBalanceDays,@annualCarryForwardDays,@staffCode;
	end
	  close order_cursor  --关闭游标
      deallocate order_cursor   --释放游标
	
end

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章