MERGE INTO在不匹配时会做两件事吗?

时间:2014-07-24 12:42:21

标签: sql sql-server-2008 relational-database

我正在使用MERGE INTO语句来处理一些表,我提出了一个简单的问题。如何制作匹配/不匹配的声明做两件事?例如,我有这个,它的工作原理:

MERGE INTO VMFG.dbo._AR_Mill1ActiveSchedule t --target
    USING #temp  --source
      On t.Base_ID = #temp.WORKORDER_BASE_ID AND t.Lot_ID = #temp.WORKORDER_Lot_ID
WHEN MATCHED AND #temp.rollstatus = 'R' THEN
    UPDATE
     SET t.sawStatus = #temp.sawstatus, t.rollStatus = #temp.rollstatus
WHEN NOT MATCHED BY TARGET THEN
    INSERT (BASE_ID, LOT_ID, sawStatus, rollstatus, preheatcheck) VALUES (#temp.WorkOrder_Base_ID, #temp.WorkOrder_Lot_ID, #temp.sawStatus, #temp.rollStatus, 'False')
WHEN NOT MATCHED BY SOURCE AND t.SawStatus = 'C' THEN
    Delete ;

Drop Table #temp

现在,我想完成这样的事情:

MERGE INTO VMFG.dbo._AR_Mill1ActiveSchedule t --target
    USING #temp  --source
      On t.Base_ID = #temp.WORKORDER_BASE_ID AND t.Lot_ID = #temp.WORKORDER_Lot_ID
WHEN MATCHED AND #temp.rollstatus = 'R' THEN
    UPDATE
     SET t.sawStatus = #temp.sawstatus, t.rollStatus = #temp.rollstatus
WHEN NOT MATCHED BY TARGET THEN
    INSERT (BASE_ID, LOT_ID, sawStatus, rollstatus, preheatcheck) VALUES (#temp.WorkOrder_Base_ID, #temp.WorkOrder_Lot_ID, #temp.sawStatus, #temp.rollStatus, 'False')
WHEN NOT MATCHED BY SOURCE AND t.SawStatus = 'C' THEN
    INSERT INTO _AR_Mill1RemovedWO (BASE_ID, LOT_ID) VALUES (#temp.WorkOrder_Base_ID, #temp.WorkOrder_Lot_ID)
    Delete ;

Drop Table #temp

但是,当我运行此操作时,我会在关键字' INTO'"附近出现错误"语法不正确。

我尝试过使用OUTPUT子句,但我无法正常使用它,如果可能的话,宁愿使用插入语句。

谢谢:)

编辑: 输出子句使用起来很棒,但我会解释它为什么不起作用。当我使用它时,即:

....
WHEN NOT MATCHED BY SOURCE AND t.SawStatus = 'C' THEN
--INSERT INTO _AR_Mill1RemovedWO (BASE_ID, LOT_ID) VALUES (#temp.WorkOrder_Base_ID, #temp.WorkOrder_Lot_ID)
Delete 
OUTPUT deleted.Base_ID, deleted.Lot_ID INTO VMFG.dbo._AR_Mill1RemovedWO
    ;

Drop Table #temp

我遇到了问题。它为我的表添加了实际上没有删除的行。就像它只是添加所有内容一样,无论是否被删除。有这个原因吗?

1 个答案:

答案 0 :(得分:1)

使用单个MERGE语句无法做到这一点。使用OUTPUT子句将有关执行的写入的信息定向到表变量中。执行第二个语句,例如INSERT,以写入第二个表。