在工作中解決一個問題,想到用雙層游標嵌套來解決,我知道這個效率低,可沒想到好的解決辦法。。。
下面貼出源碼記錄一下吧
--1.需要傳入的變量 TB_Bill.dt_DealDate1 TB_Bill.dt_DealDate2 TB_DraftBill.s_Draftor create proc MyProcJian --@sname varchar(100), @dt_DealDate1 date, @dt_DealDate2 date, @s_Draftor varchar(10), @IsRight int output --傳出參數 as --1.在賬單表中找出符合條件的s_BillNum,用s_BillNum在TB_DraftBill表中找出有多條數據的,取出這些數據的TB_DraftBill.n_DBillID。 --再用TB_DraftBill.n_DBillID去表TB_DBillList查出對應的數據 取到TB_DBillList.n_CStatusFeeID --用這個TB_DBillList.n_CStatusFeeID 去表 TB_BillList 中查對應的數據 ,取出數據中的代理費 n_AttrFee,將之減去。 declare @JianAttFee int -- 記錄要減去的總代理費 declare @mycount int --s_BillNum在TB_DraftBill表中找出有多條數據的的個數 set @JianAttFee = 0 declare @s_BillNum sysname --賬單號 declare @tempJian int --單個賬單號對應的臨時要減去的值 declare @n_DBillID sysname --TB_DraftBill表的主鍵 declare my_cursor cursor for --聲明主游標 select distinct TB_Bill.s_BillNum from TB_Bill inner join TB_BillList on TB_Bill.n_BillID = TB_BillList.n_BillID inner join TB_DraftBill on TB_Bill.s_BillNum = TB_DraftBill.s_BillNum where TB_Bill.dt_DealDate >= @dt_DealDate1 --'2016-12-01 00:00:00' AND TB_Bill.dt_DealDate <= @dt_DealDate2 --'2016-12-31 23:59:59' and TB_DraftBill.s_Draftor like @s_Draftor --'%孫威龍%' open my_cursor fetch next from my_cursor into @s_BillNum while(@@fetch_status=0) begin set @mycount =(select count(*) from (select TB_DraftBill.n_DBillID from TB_DraftBill where TB_DraftBill.s_BillNum like @s_BillNum)T) if(@mycount>1) --如果是有多個撰寫人 begin declare my_cursor2 cursor for --聲明子游標 select TB_DraftBill.n_DBillID from TB_DraftBill where TB_DraftBill.s_BillNum like @s_BillNum and TB_DraftBill.s_Draftor not like @s_Draftor --'%孫威龍%' open my_cursor2 fetch next from my_cursor2 into @n_DBillID while(@@fetch_status=0) begin set @tempJian = (select sum(TB_BillList.n_AttrFee) from TB_BillList inner join TB_DBillList on TB_BillList.n_CStatusFeeID = TB_DBillList.n_CStatusFeeID inner join TB_DraftBill on TB_DraftBill.n_DBillID = TB_DBillList.n_DBillID where @mycount > 1 and TB_DraftBill.n_DBillID = @n_DBillID) set @JianAttFee = @JianAttFee + @tempJian fetch next from my_cursor2 into @n_DBillID end close my_cursor2 --關閉子游標 deallocate my_cursor2 set @mycount = 0 --將一個賬單號對應的數據數再次設置為0 end else begin set @mycount = 0 end fetch next from my_cursor into @s_BillNum end close my_cursor deallocate my_cursor --print @JianAttFee go --下面開始執行 declare @JianAttFee int exec MyProcJian '2016-12-01 00:00:00','2016-12-31 23:59:59','孫威龍', @JianAttFee output --select @JianAttFee print @JianAttFee