将已删除的数据从表移动到另一个表

时间:2013-09-01 20:23:09

标签: sql-server-2008-r2

将已删除的数据从表移动到另一个表的最佳方法是什么?假设两个表都有相同的列定义?

EmpTable
EmpID(PK, identity) EmpName(nvarchar(max)) Picture(varbinary(max)) 

DeletedEmpTable
DeletedEmpID(PK, identity) EmpID(int) EmpName(nvarchar(max)) Picture(varbinary(max)) 

1 个答案:

答案 0 :(得分:2)

如果表没有参与外键,有触发器,有标识列,计算列等,你可以用the OUTPUT clause做这样的事情:

DELETE dbo.Table1
OUTPUT deleted.* 
INTO dbo.Table2
WHERE ...

您可以通过编写更具创意的OUTPUT子句来解决其中一些限制,但不是全部。如果您有任何阻止使用OUTPUT子句的限制,则可以使用INSTEAD OF trigger执行这两项操作。

CREATE TRIGGER dbo.TriggerOnTable1
  ON dbo.Table1
  INSTEAD OF DELETE
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.Table2(cols) SELECT cols FROM deleted;

  DELETE t FROM dbo.Table1 AS t
    INNER JOIN deleted AS d
    ON t.key_column = d.key_column;
END
GO

很多人质疑INSTEAD OF触发器与常规触发器相比的价值。我喜欢他们的是,如果你有任何可能导致你取消删除的验证,你可以取消删除而不是让它发生然后再回滚。