• 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
        
  • 相关阅读:
    xtrabackup详细用法
    CentOS国内YUM源及配置
    CentOS7系统配置国内yum源和epel源
    Zabbix的定期备份
    Zabbix的邮件告警
    石头剪刀布---组合数取模,数论
    组合数取模介绍----Lucas定理介绍
    乘法逆元
    费马小定理
    欧几里德与扩展欧几里德算法----数论
  • 原文地址:https://www.cnblogs.com/xiaobaidejiucuoben/p/13398992.html
Copyright © 2020-2023  润新知