您的位置:首页 > 数据库

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

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

下面的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


SQL回炉系列(一) 序言

SQL回炉系列(二) 多表联合查询和排序

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

SQL回炉系列(四) 删除重复数据

SQL回炉系列(五) 为显示曲线图获取不同时间颗粒的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: