大家早上好,我正在试图找出如何将某些行从一个表移动到另一个表。这是踢球者;此活动表中的每一行都具有字母D和yyyymmdd的日期格式(例如,今天将是D20161020)。我想要做的是从上个月获取所有行(例如D201609 ##)并将它们移动到存档表(复制然后删除复制的行)。
我的计划和想法是尽可能快地保持当前数据的精益。是的,我正在使用索引,我只是不希望表格变大。 :)每天,我将3000多条记录导入该表。为了苗条,我将记录ID引用到主记录表。本质上,该表具有主记录表RecID的RecID外键和该格式Dyyyymmdd的日期。我将该日期的计数放入相应的记录中。
这是另一回事,我希望只将当前月份的数据保留在活动表中。
我打算按年保存档案表,即2016counts,2017counts将保留当年的数据。
我计算年度归档表,我可以简单地创建一个过程,将所有数据从当前归档表复制到年份归档,然后截断该活动表。或者重命名表并重新创建一个类似它的空白表,因为活动归档表中没有任何内容,除了第一列,它是来自主记录表的相关记录ID。
答案 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