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

 

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