在WHEN MATCHED中使用多个语句

时间:2017-09-10 13:19:43

标签: sql sql-server tsql merge sql-update

我正在使用MERGE语句将XML输入插入SQL Server数据库表。如何在WHEN MATCHED块中执行多个条件。请参考以下代码。

USING TableRelationship AS new
  ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND old.ToRoleID = @RoleID

WHEN MATCHED THEN 
   UPDATE 
       SET old.FromRoleID = new.FromRoleID
   -- Condition 2
   -- Condition 3

目前WHEN MATCHED它只执行此old.FromRoleID = new.FromRoleID行。如何在-- Condition 2 and 3条件下执行所有3行(WHEN NOT MATCHED)。

前:

这就是我的期望。 WHEN MATCHED我只想更新旧字段(old.ThruDate = GETDATE())并将记录插入同一个表。我不能用逗号分隔这些陈述。 SQL发出

  

语法不正确

MERGE INTO Party.TableRelationship AS old
USING TableRelationship AS new ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND old.ToRoleID = @RoleID

WHEN MATCHED THEN 
   UPDATE 
       SET old.ThruDate = GETDATE(),
   INSERT (FromRoleID, ToRoleID, TableRelationshipTypeID)
   VALUES (new.FromRoleID, new.ToRoleID, new.TableRelationshipTypeID);

谢谢。

4 个答案:

答案 0 :(得分:2)

您可以使用 INSERT over DML 来实现它:

INSERT INTO tab_name(FromRoleID, ToRoleID, TableRelationshipTypeID)
SELECT FromRoleID, ToRoleID, TableRelationshipTypeID
FROM (
  MERGE INTO Party.TableRelationship AS old
  USING TableRelationship AS new 
     ON new.TableRelationshipTypeID = old.TableRelationshipTypeID 
    AND old.ToRoleID = @RoleID
  WHEN MATCHED THEN 
    UPDATE SET old.ThruDate = GETDATE()
    OUTPUT $action, FromRoleID, ToRoleID, TableRelationshipTypeID
) sub(action, FromRoleID, ToRoleID, TableRelationshipTypeID)
WHERE action = 'UPDATE';

请注意,此方法有一些限制更多信息:  MS Connect

答案 1 :(得分:1)

这不是合并声明的用途。合并语句要么更新记录(如果它们已经存在)(如果匹配那么),或者如果它们不存在则插入记录(当不匹配时)。它不是为了在找到匹配时插入记录而设计的

(旁注:sqlserver合并语句可以指定WHEN MATCHED两次,也许你会使用它,目的是其中一个匹配从目标中删除匹配某些附加条件的记录,另一个指定列的列表到如果附加逻辑测试为假则更新)

如果要在匹配记录时混合并匹配插入和更新,则需要使用其他内容,例如对更新做出反应的存储过程或触发器

或者,如果你只是询问合并语句的语法,你的插入指令需要在WHEN NOT MATCHED INSEN INSERT之前......

答案 2 :(得分:1)

不能这样做 - SQL Server的MERGE声明只是不支持

WHEN MATCHED案例中,您可以执行一个UPDATE(或DELETE)语句 - 您不能在彼此之后拥有多个不同的语句。

检查official MSDN documentation for MERGE - 它详细说明可能的内容以及不详细支持的内容:

语法:

MERGE   
    USING <table_source> ON <merge_search_condition>  
    [ WHEN MATCHED [ AND <clause_search_condition> ]  
        THEN <merge_matched> ] [ ...n ]  
;  

<merge_matched>::=  
    { UPDATE SET <set_clause> | DELETE }  
  

MERGE语句最多可以有两个WHEN MATCHED子句。如果两个   条款是指定的,那么第一个条款必须附有一个   AND条款。对于任何给定的行,第二个WHEN   MATCHED子句仅在第一个不是时应用。如果有两个   WHEN MATCHED子句,则必须指定UPDATE操作和一个   必须指定DELETE操作

答案 3 :(得分:0)

这些不是条件,它们是转让条款。您可以用逗号分隔它们,如update

USING TableRelationship AS new
  ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND 
     old.ToRoleID = @RoleID
  WHEN MATCHED THEN UPDATE
      SET old.FromRoleID = new.FromRoleID,
          <assignment 2>,
          <assignment 3>;