什么控制SQL MERGE语句中的INSERT,UPDATE和DELETE操作的顺序?

时间:2016-12-22 09:18:31

标签: sql sql-server sql-merge

SQL Server的public class getVariable{ public static void main(String[] args) { ReadPropertyFile propCls = new ReadPropertyFile(); propCls.setValue(); String gateway= propCls.getGateway(); System.out.println(gateway); } } 如何工作?

如果要执行多项操作(MERGEINSERTUPDATE)那么是什么控制了这些操作的执行顺序?

2 个答案:

答案 0 :(得分:0)

来自MSDN

  

对于MERGE中指定的每个插入,更新或删除操作   声明,SQL Server触发定义的任何相应的AFTER触发器   在目标表上,但不保证要触发的操作   触发第一个或最后一个。

如果我已正确理解文档,则SQL Server不保证任何订单。它会在它认为合适时执行您的查询。

答案 1 :(得分:0)

根据我的评论,查看MERGE MERGE

INSERT语句中,您可以指定如何匹配源表和目标表之间的记录以及存在(或不匹配)时要执行的操作。因此,这决定了UPDATE编辑的记录,DELETEMERGE Production.UnitMeasure AS target USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name) ON (target.UnitMeasureCode = source.UnitMeasureCode) WHEN MATCHED THEN UPDATE SET Name = source.Name WHEN NOT MATCHED THEN INSERT (UnitMeasureCode, Name) VALUES (source.UnitMeasureCode, source.Name) OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable; d。

请查看上述文档页面中的示例:

target.UnitMeasureCode = source.UnitMeasureCode

此处,它们匹配Name上的记录以及匹配的记录,它们使用来自源的SELECT Id, SUBSTRING( (SELECT ',' + lts.Selection FROM LiveTrainingSelections lts INNER JOIN LiveTraining lt ON lt.Id = lts.LiveTrainingId WHERE lts.SelectionType = 'Session Format' and lts.LiveTrainingId = lt.Id FOR XML PATH('')),2,200000) AS SelectionDetails FROM LiveTraining lt JOIN LiveTrainingSelections lts ON lt.Id = lts.LiveTrainingId 值更新目标记录。如果没有匹配项,则使用源记录中的值将新记录插入目标表。