Sql server 存档存储过程
大家早上好,我正在尝试找出如何将某些行从一个表移动到另一个表。这是踢球者;此活动表中的每一行都有一个日期格式,即字母D和yyyymmdd。例如,今天的日期格式为D20161020。我试图做的是将上个月的所有行(例如D201609)移到存档表副本中,然后删除复制的行 我的计划和想法是保持当前数据尽可能快。是的,我正在使用索引,我只是不希望表变得那么大每天,我将3000多条记录导入该表。对于苗条,我通过记录ID引用主记录表。基本上,该表有一个主记录表RecID的RecID外键,日期的格式为Dyyyymmdd。我将该日期的计数放入相应的记录中 还有一件事,我希望只在活动表中保留当月的数据 我计划按年份保存归档表,即2016counts、2017counts,它们将保存当年的数据Sql server 存档存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,大家早上好,我正在尝试找出如何将某些行从一个表移动到另一个表。这是踢球者;此活动表中的每一行都有一个日期格式,即字母D和yyyymmdd。例如,今天的日期格式为D20161020。我试图做的是将上个月的所有行(例如D201609)移到存档表副本中,然后删除复制的行 我的计划和想法是保持当前数据尽可能快。是的,我正在使用索引,我只是不希望表变得那么大每天,我将3000多条记录导入该表。对于苗条,我通过记录ID引用主记录表。基本上,该表有一个主记录表RecID的RecID外键,日期的格式为Dyyyy
我认为对于年度归档表,我可以简单地创建一个过程,将当前归档表中的所有数据复制到年度归档,然后截断该活动表。或者重命名该表,只需重新创建一个与之类似的空白表,因为活动存档表中除了第一列之外没有任何内容,第一列是主记录表中的一个相关记录ID。以下是一个示例,其中包含了您需要执行的大部分操作。希望这些评论能够不言自明地说明每一步都在做什么。下面的代码是可重新运行的,因此您可以查看它生成的输出,并对其进行调整以测试不同的变体
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
请用一些示例数据解释并显示最终输出您真的打算移动列吗?你的意思是你想移动行吗?@TT。我做出了这样的假设,希望这是正确的假设。我会在今天的一小段时间内试一试,它看起来与我正在尝试做的相似,可能需要一些调整来动态地拉入上个月/年的日期。我会再打给你的。谢谢:我最终使用了一个内置在存储过程中的动态查询。我现在需要做的是使用动态SQL删除上个月的记录,但我必须通过计算来确定月份和年份。我喜欢你使用临时表。要查看程序,请转到该链接“不适用于我”,如果您有后续问题,请询问另一个问题或编辑此问题,只要问题没有太大变化,因此我的答案没有意义。