SQL Server MERGE语句—将数据从一个表移动到另一个表



在下面的MERGE语句中,NewTable和OldTable有相同的3列:EmployeeIdDivisionIdnvarchar(50)列,Unpublishedbit列。

我需要移动将OldTable中Unpublished = 1的所有记录放入NewTable中。因此使用INSERT(对NewTable)和DELETE(对OldTable)语句。我必须使用MERGE(作为迁移规则的一部分)。

INSERT部分工作正常,但DELETE部分给了我一个错误,说"在MERGE语句的'WHEN not MATCHED'子句中不允许'DELETE'类型的操作"。

在这种情况下,DELETE子句应该如何写?

MERGE NewTable as target
USING OldTable as source
on target.EmployeeId = source.EmployeeId
WHEN NOT MATCHED AND source.Unpublished = 1
THEN INSERT (EmployeeId,DivisionId,Unpublished)
VALUES (source.EmployeeId, DivisionId, source.Unpublished)
WHEN NOT MATCHED AND source.Unpublished = 1
THEN DELETE;

让我们从使用一些可能说服现有现状改变的格式开始:

评论里的人都是老兵。MERGE语句的语法很诱人,但实现得不好,充满了危险。避免它。

现在我们解决了这个问题,下一件事是理解你到底想要删除什么。我注意到你的问题:

and then DELETE (from OldTable)语句

merge语句可以在单个表上执行所有操作(插入、更新、删除),这个表在merge之后别名,在您的示例中是NewTable。但是,不能从同一合并中的另一个表(OldTable)中删除。您可以做的是使用output子句来跟踪NewTable中哪些行是inserted,以便您可以然后在OldTable上运行delete。

相关内容

最新更新