SQL回炉系列(三) 拆分原始数据到对应的月份表中

存放原始数据的表,需要定期把历史数据迁移并固定保存下来,否则原始数据表越来越大,不利于数据的频繁插入和查询。

下面的SQL语句是一个存储过程,每日0点执行,把前一天或前几天的数据迁移到对应的月份表中。

USE [PRODMS]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER proc [dbo].[SplitOriginalValue]  
AS
BEGIN
    DECLARE @day int,@month int,@year int
    DECLARE @tbname varchar(35),@sql NVarchar(4000),@parmas Nvarchar(2000) 
    SELECT @day= datepart (dd,min(getTime)) ,@month=datepart(mm,min(getTime)),@year=datepart(YEAR,min(getTime))  from CF_OriginalData 
    IF(@month<10)
    SET @tbname='CF_OriginalData_'+Convert(varchar(4),@year)+'_0'+Convert(varchar(2),@month)
    ELSE
    SET @tbname='CF_OriginalData_'+Convert(varchar(4),@year)+'_'+Convert(varchar(2),@month)

    --如果不存在该月份的表名需要新建一个该月份的表
    IF not exists(select * from sysobjects where name=@tbname) 
    BEGIN
        set @sql='
        create Table '+@tbname+'
        (
            AutoId int identity (1,1) primary key,
            UA decimal(10,2),   
            UB decimal(10,2),   
            UC decimal(10,2),   
            IA decimal(10,2),   
            IB decimal(10,2),   
            IC decimal(10,2),   
            py decimal(10,2),   
            Qw decimal(10,2),   
            pf decimal(10,2),   
            EP decimal(12,2),    
            back varchar(5),    
            F decimal(10,2),     
            getTime dateTime, 
            Number  Nvarchar(20) )' 
        execute ( @sql) 
    END

    IF @day<DATEPART(dd,getdate())  and  @month=DATEPART(mm,getdate()) -- 判断OriginalData中最早的数据是否小于今天且是同一个月的
        BEGIN    
            -- 插入数据到月份表中
            SET @sql=' insert into  ' +@tbname+'  (UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number )
            select UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number  from CF_OriginalData 
            where  Convert(varchar(10),getTime,120)<= Convert(varchar(10),dateAdd(dd,-1,getdate()),120)' 
            execute ( @sql)      

            -- 删除OriginalData中的数据
            DELETE FROM CF_OriginalData where Convert(varchar(10),getTime,120)<= Convert(varchar(10),dateAdd(dd,-1,getdate()),120)
        END
     ELSE  -- 新的月份
     BEGIN  
              SET @sql=' insert into  ' +@tbname +' 
              ( UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number ) '
              + ' select UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number  from CF_OriginalData where DATEPART(dd,getTime)= @days '
              execute ( @sql) 

              -- 删除OriginalData中的数据
              DELETE FROM CF_OriginalData WHERE DATEPART(dd,getTime)= @day and DATEPART(mm,getTime)= @month and DATEPART(yyyy,getTime)= @year
     END 
END 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值