SQLserver 游标使用

Posted 。。。。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLserver 游标使用相关的知识,希望对你有一定的参考价值。

--CREATE PROCEDURE PF_ETL_BA_AR_KH (@BeginDate datetime, @IncreaseFlag int, @DataSource nvarchar(40))
--as
if object_id(tempdb..#temp_u8_ar_age_kh) is not null
    drop table #temp_u8_ar_age_kh

create table #temp_u8_ar_age_kh(
    --AccountTime bigint NULL,
    --CodeID nvarchar(128) NULL,
    Code nvarchar(64) NULL,
    --DayCount int NULL,
    ArMoney decimal(27,8) NULL,
    --mc decimal(27,8) NULL,
    CustomerID nvarchar(64) NULL,
    dbilldate datetime null
)  

if object_id(tempdb..#temp_u8_ar_kh_mc) is not null
    drop table #temp_u8_ar_kh_mc

create table #temp_u8_ar_kh_mc(
    Code nvarchar(64) NULL,
    mc decimal(27,8) NULL,
    CustomerID nvarchar(64) NULL
)  



--获取帐套的起始日期 和模块的启用日期
declare @dbname nvarchar(32)
    , @AccNo nvarchar(32)
    , @dbStartYear int ,@dbEndYear int , @dbStartDate datetime ,@dbEndDate datetime,@ModelStartDate datetime, @QueryDate datetime,@MonthLastday datetime
set @dbname=db_name()
SET @AccNo = SUBSTRING(@dbname,8,3)


--物理库起始日期
select @dbStartYear=year(GETDATE()) ,@dbEndYear = isnull(iEndYear,2099)  from ufsystem..ua_accountdatabase where cDatabase=@dbname
select @dbStartDate = min(dBegin), @dbEndDate = max(dEnd), @dbEndYear = max(iYear) from ufsystem..ua_period where iYear >=@dbStartYear and iYear <= @dbEndYear  and cAcc_Id=@AccNo 
set @MonthLastday=CONVERT(varchar(100),  DATEADD(Day,-1,CONVERT(char(8),DATEADD(month,1,@MonthLastday),120)+1), 23)--最后一天
print @dbStartYear
print @dbStartDate
print @dbEndDate
print @dbEndYear

declare @a_ccusid nvarchar(50)       
declare @a_ccode nvarchar(50)       
declare @a_dbilldate nvarchar(50)       
declare @a_md decimal(27,8)     
declare @a_mc decimal(27,8) 


insert into #temp_u8_ar_kh_mc(CustomerID,Code,mc)
    select  gl_accvouch.ccus_id,gl_accvouch.ccode,SUM(mc)
    from gl_accvouch 
    where ccus_id is not null   and (iflag=2 or iflag is null)   and ibook=1 
    and not ibook is Null  and (cCode like 1122% or cCode like 1221%)
    and  iYear between 2019 and 2020 and iperiod<=12  --@dbStartYear
    and (bdelete=0 or  (bdelete=1 and left(cast(wllqperiod as nvarchar(6)),4) >2020)  ) --@dbStartYear
    and dbill_date<= 2020-06-30 and ccode in (select ccode from code where iyear=2020) and  isnull(mc,0) !=0 --@dbStartYear
    --and gl_accvouch.ccus_id=‘200011‘ 
    and gl_accvouch.ccode=112204
    group by gl_accvouch.ccus_id,gl_accvouch.ccode

DECLARE Cur_findRef CURSOR   --定义游标
FOR

select gl_accvouch.ccus_id,gl_accvouch.ccode,gl_accvouch.dbill_date,
--datediff(day,gl_accvouch.dbill_date,convert(datetime,‘2020-06-30‘,102)) ts,
sum(isnull(md,0))
from gl_accvouch 
where ccus_id is not null   and (iflag=2 or iflag is null)   and ibook=1 
and not ibook is Null  and (cCode like 1122% or cCode like 1221%)
and  iYear between 2019 and 2020 and iperiod<=12  
and (bdelete=0 or  (bdelete=1 and left(cast(wllqperiod as nvarchar(6)),4) >2020)  ) 
and dbill_date<= 2020-06-30 and ccode in (select ccode from code where iyear=2020) and  isnull(md,0) !=0 
--and gl_accvouch.ccus_id=‘200011‘ 
and gl_accvouch.ccode=112204
group by gl_accvouch.ccus_id,gl_accvouch.ccode,gl_accvouch.dbill_date
order by gl_accvouch.ccus_id,gl_accvouch.ccode,gl_accvouch.dbill_date


open  Cur_findRef        --打开游标
  fetch   next   from  Cur_findRef into  @a_ccusid ,@a_ccode, @a_dbilldate, @a_md   --下一条游标数据
WHILE @@FETCH_STATUS =0 
BEGIN 
print 1

 

-- print @@FETCH_STATUS
--select @a_ccusid+‘_‘+@a_ccode+‘_‘+@a_dbilldate+‘_‘+convert(varchar(30),@a_md)
     select @a_mc=sum(isnull(mc,0))
    from #temp_u8_ar_kh_mc 
    where CustomerID = @a_ccusid  and Code=@a_ccode
    print qmc: +convert(varchar(30),@a_mc)
    print qmd: +convert(varchar(30),@a_md)
     
    print q+@a_ccusid+_+@a_ccode+_+@a_dbilldate+_+convert(varchar(30),@a_md)
     
    if(@a_mc>=@a_md )
    begin 
        print 1
        insert into #temp_u8_ar_age_kh(CustomerID,Code,dbilldate,ArMoney)
        select @a_ccusid,@a_ccode,@a_dbilldate,0    
        print mc: +convert(varchar(30),@a_mc)+@a_ccusid+@a_ccode
        print md: +convert(varchar(30),@a_md)+@a_ccusid+@a_ccode
        
        update a set a.mc=@a_mc-@a_md from #temp_u8_ar_kh_mc a where CustomerID = @a_ccusid  and Code=@a_ccode 
    end
    else
    begin 
        print 2
        insert into #temp_u8_ar_age_kh(CustomerID,Code,dbilldate,ArMoney)
        select @a_ccusid,@a_ccode,@a_dbilldate,(@a_mc-@a_md)*-1    
        print mc: +convert(varchar(30),@a_mc)
        print md: +convert(varchar(30),@a_md)
        
        update a set a.mc=0 from #temp_u8_ar_kh_mc a where CustomerID = @a_ccusid  and Code=@a_ccode
    end
    fetch   next   from  Cur_findRef into  @a_ccusid ,@a_ccode, @a_dbilldate, @a_md--下一条游标数据
end



CLOSE Cur_findRef--关闭游标

DEALLOCATE Cur_findRef--释放游标



select * from #temp_u8_ar_age_kh

--go
    

 

以上是关于SQLserver 游标使用的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer之游标深入

sqlserver中怎样使用游标for循环

sqlserver中怎样使用游标for循环

sqlserver 游标的使用

sqlserver 游标的使用

使用带有 JDBC 和 SQLServer 的数据库 API 游标来选择批处理结果