将删除的数据从一个表移动到另一个表的最佳方法是什么?假设两个表具有相同的列定义?
EmpTable
EmpID(PK, identity) EmpName(nvarchar(max)) Picture(varbinary(max))
DeletedEmpTable
DeletedEmpID(PK, identity) EmpID(int) EmpName(nvarchar(max)) Picture(varbinary(max))
将删除的数据从一个表移动到另一个表的最佳方法是什么?假设两个表具有相同的列定义?
EmpTable
EmpID(PK, identity) EmpName(nvarchar(max)) Picture(varbinary(max))
DeletedEmpTable
DeletedEmpID(PK, identity) EmpID(int) EmpName(nvarchar(max)) Picture(varbinary(max))
如果表不参与外键、有触发器、有标识列、计算列等,您可以使用该OUTPUT
子句执行以下操作:
DELETE dbo.Table1
OUTPUT deleted.*
INTO dbo.Table2
WHERE ...
您可以通过编写更具创造性的条款来解决其中的一些限制OUTPUT
,但不是全部。如果您有任何限制阻止使用该OUTPUT
子句,您可以使用INSTEAD OF
触发器来执行这两个操作。
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
与常规后触发器相比,很多人质疑触发器的价值。我喜欢他们的是,如果您有任何可能导致您取消删除的验证要执行,您可以取消删除而不是允许它发生然后回滚。