在下面的MERGE语句中,NewTable和OldTable有相同的3列:EmployeeId
和DivisionId
是nvarchar(50)
列,Unpublished
是bit
列。
我需要移动将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。