【问题标题】:Archive data older than DateTime (number of days) SQL归档日期早于 DateTime(天数)的数据 SQL
【发布时间】:2020-06-09 11:10:36
【问题描述】:

我有一个简单的 SQL 查询,我打算将它放入一个存储过程中,以便将旧数据从一个表移动到一个存档表中。我知道有很多方法可以做到这一点,但这是我想出的:

DECLARE @days INT
SELECT Product.* INTO 
ProductArchive
WHERE OrderDateTimeUTC  = DATEADD(d, -(@days), GETUTCDATE())

这个想法是让它成为一个每隔一段时间运行的 SQL 作业。 有没有为此的“最佳实践”?主表在任何时候都只有少于 2000 行。

【问题讨论】:

  • 您的代码将数据复制而不是移动到新表中,并且如果多次运行将出错,因为目标表已经存在。存档数据的许多其他方法之一是创建与源具有相同架构的存档表,并使用带有OUTPUT 子句的 DELETE 定期移动行。最佳做法是指定显式列列表而不是 *
  • 最多 2000 行并不是那么多。因此,也许,如果您只想存档它们而这与性能无关,您可以添加一些标志 activearchived 可以定期更新,然后在视图或应用程序中使用?

标签: sql sql-server stored-procedures ssms


【解决方案1】:

好的,这就是我解决自己问题的方法,即将数据从一个表移动到存档表,然后从主表中删除。我基本上使用了合并和删除以及临时表。 我将查询放在存储过程中

DECLARE @days INT
DECLARE @TempTable TABLE
(
  productid int NOT NULL
)
MERGE  ProductArchive as T 
USING (SELECT * FROM Product
WHERE OrderDateTimeUTC  = DATEADD(d, -(@days), GETUTCDATE()) 
) as S
ON T.productid = S.productid
WHEN NOT MATCHED 
THEN 
INSERT 
(
--Insert 
)
VALUES
(
--values
)
--Delete from origin table
OUTPUT inserted.productid INTO @TempTable;
DELETE FROM Product WHERE productid 
IN(SELECT productid From @TempTable)

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2012-08-10
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多