档案存储过程

时间:2016-10-21 10:12:53

标签: sql-server stored-procedures

大家早上好,我正在试图找出如何将某些行从一个表移动到另一个表。这是踢球者;此活动表中的每一行都具有字母D和yyyymmdd的日期格式(例如,今天将是D20161020)。我想要做的是从上个月获取所有行(例如D201609 ##)并将它们移动到存档表(复制然后删除复制的行)。

我的计划和想法是尽可能快地保持当前数据的精益。是的,我正在使用索引,我只是不希望表格变大。 :)每天,我将3000多条记录导入该表。为了苗条,我将记录ID引用到主记录表。本质上,该表具有主记录表RecID的RecID外键和该格式Dyyyymmdd的日期。我将该日期的计数放入相应的记录中。

这是另一回事,我希望只将当前月份的数据保留在活动表中。

我打算按年保存档案表,即2016counts,2017counts将保留当年的数据。

我计算年度归档表,我可以简单地创建一个过程,将所有数据从当前归档表复制到年份归档,然后截断该活动表。或者重命名表并重新创建一个类似它的空白表,因为活动归档表中没有任何内容,除了第一列,它是来自主记录表的相关记录ID。

1 个答案:

答案 0 :(得分:1)

这是一个示例,其中包含您执行所需操作所需的大部分内容。希望这些评论可以自我解释每个步骤的作用。以下代码是可重新运行的,因此您可以查看它生成的输出并进行调整以测试不同的变体。

CREATE TABLE #Main ( DateVal NVARCHAR(15) -- should be a date really!!!
                     )

CREATE TABLE #Archive ( DateVal NVARCHAR(15) -- should be a date really!!!
                        )

INSERT  INTO #Main
        ( DateVal
        )
        SELECT  'D20161001'
        UNION ALL
        SELECT  'D20161002'
        UNION ALL
        SELECT  'D20161003'
        UNION ALL
        SELECT  'D20161004'
        UNION ALL
        SELECT  'D20160913'
        UNION ALL
        SELECT  'D20160911'
        UNION ALL
        SELECT  'D20161007'
        UNION ALL
        SELECT  'D20160901'

-- values as they are
SELECT  DateVal
FROM    #Main

-- values with dates formatted from values and month extracted
SELECT  DateVal ,
        RIGHT(DateVal, 8) AS DateSection ,
        CAST(RIGHT(DateVal, 8) AS DATE) ConvertedToDate ,
        DATEPART(MONTH, ( CAST(RIGHT(DateVal, 8) AS DATE) )) MonthPart
FROM    #Main

-- values not in current month - to archive
SELECT  DateVal ,
        RIGHT(DateVal, 8) AS DateSection ,
        CAST(RIGHT(DateVal, 8) AS DATE) ConvertedToDate ,
        DATEPART(MONTH, ( CAST(RIGHT(DateVal, 8) AS DATE) )) MonthPart
FROM    #Main
WHERE   DATEPART(MONTH, ( CAST(RIGHT(DateVal, 8) AS DATE) )) < DATEPART(MONTH,
                                                              GETDATE())

-- insert the archived records
INSERT  INTO #Archive
        ( DateVal
        )
        SELECT  DateVal
        FROM    #Main
        WHERE   DATEPART(MONTH, ( CAST(RIGHT(DateVal, 8) AS DATE) )) < DATEPART(MONTH,
                                                              GETDATE())

-- delete the archived records
DELETE  #Main
WHERE   DATEPART(MONTH, ( CAST(RIGHT(DateVal, 8) AS DATE) )) < DATEPART(MONTH,
                                                              GETDATE())

-- see what's archived
SELECT  *
FROM    #Archive

-- see what's active
SELECT  *
FROM    #Main

DROP TABLE #Main
DROP TABLE #Archive