【问题标题】:Query to move some records and then delete them查询移动一些记录然后删除它们
【发布时间】:2015-06-24 13:55:26
【问题描述】:

如果我的问题对你们中的某些人来说听起来太简单了,我深表歉意。我是 SQL Server 的新手,我迫切需要建议。我做了我的研究,但我仍然不确定如何继续,因为我读到的所有关于它的文章似乎都太笼统了。

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

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

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

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

然后用“delete”代替“select”来删除它们。

在这两个查询之间我应该写些什么来确保在删除它们之前确实传输了这些行?如何在从服务器 1 中删除记录之前自动检查记录是否已经在服务器 2 上?如果无法做到这一点,您能否提出替代解决方案?

我使用的是 Enterprise x64 版本,并且我的帐户具有系统管理员权限。我对在 SQL 代理中创建工作非常满意,对 SSIS 也很满意(非常欢迎提示)。

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

【问题讨论】:

    标签: sql sql-server ssis sql-agent


    【解决方案1】:

    您使用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
    

    【讨论】:

      【解决方案2】:
      1. 创建一个表变量或临时表来存储您要移动的记录的 ID 列表。
      2. 执行 INSERT 语句将记录从一个数据库复制到另一个数据库。
      3. 根据连接到新数据库的临时表中的 ID 从原始数据库中删除记录。

      使用这样的临时表可以防止您在 getdate() 值不断变化时随时捕获不同的记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2013-03-15
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        相关资源
        最近更新 更多