在 WHEN MATCHED 中使用多个语句

问题描述 投票:0回答:4

我正在使用

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);

谢谢你。

sql sql-server t-sql merge sql-update
4个回答
3
投票

您可以使用

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';

将MERGE语句的结果插入到另一个表中


2
投票

不能这样做 - SQL Server 的MERGE声明很明显

不支持

WHEN MATCHED
的情况下,您只能执行一个 UPDATE
(或 
DELETE
)语句 - 您不能依次拥有多个不同的语句。 

查看

官方 MSDN 文档以获取 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 操作


1
投票
这不是合并语句的用途。合并语句要么更新记录(如果记录已存在)(WHEN MATCHED THEN),要么插入记录(如果记录不存在)(WHEN NOT MATCHED THEN)。它的设计目的不是在找到匹配项时插入记录

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

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

或者,如果您只是询问合并语句的语法,则插入指令之前需要加上 WHEN NOT MATCHED THEN INSERT ...


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>;
    
© www.soinside.com 2019 - 2024. All rights reserved.