查询移动一些记录然后将其删除

时间:2015-06-24 13:55:27

标签: sql sql-server ssis sql-agent

如果我的问题对你们这些人来说太容易了,我会道歉。我是SQL Server的新手,我迫切需要建议。我做了我的研究,但我仍然不确定如何继续进行,因为我读到的关于它的所有文章似乎有点过于通用。

我的任务是保持表ABC(在服务器1上)没有超过3个月的记录。超过3个月的记录应自动移动到服务器2上的表ABC_ARCHIVE。只是处理和删除记录并不是什么大问题,但我想在删除它们之前自动检查记录是否已在服务器2上来自服务器1.

我考虑过使用一个查询,我将在SSIS包中运行,而SSIS包又将在SQL Server Agent作业中运行。如果你认为我应该对此有所不同,请告诉我。我宁愿避免涉及任何不需要的组件。

要选择超过3个月的记录,我需要类似下面的查询:

Select *
From ABC
WHERE [CreateDate] <= DATEADD(mm, -3, GETDATE())

然后用“删除”代替“选择”来删除它们。

我在这两个查询之间写了什么来确保在删除行之前确实已经传输了这些行?如何在从服务器1删除记录之前自动检查记录是否已在服务器2上?如果不可能这样做,你能否建议替代解决方案?

我正在使用Enterprise x64版本,我的帐户具有sysadmin权限。我非常适合在SQL Agent中创建作业并且对SSIS适度感到满意(非常欢迎提示)。

我将非常感谢任何提示和建议。提前谢谢!

2 个答案:

答案 0 :(得分:4)

您可以将OUTPUT子句用于以下操作:

以下是使用表变量的工作示例:

DECLARE @t1 table(CreateDate datetime, col1 int, col2 int)
DECLARE @t2 table(CreateDate datetime, col1 int, col2 int)
INSERT @t1 values('2015-01-01', 1,1)
INSERT @t1 values('2016-01-01', 1,1)

DELETE
FROM @t1
OUTPUT deleted.CreateDate, deleted.col1, deleted.col2 into @t2
WHERE [CreateDate] <= DATEADD(mm, -3, GETDATE())

SELECT * FROM @t1

SELECT * FROM @t2

答案 1 :(得分:1)

  1. 创建表变量或临时表,以存储要移动的记录的ID列表。
  2. 执行INSERT语句将记录从一个数据库复制到另一个数据库。
  3. 根据加入新数据库的临时表中的ID,从原始数据库中删除记录。
  4. 使用这样的临时表可以防止您不断捕获不同的记录,因为getdate()值会不断变化。