我正在使用
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);
谢谢你。
您可以使用
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';
你不能这样做 - 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 操作
(旁注:sqlserver 合并语句可以指定 WHEN MATCHED 两次,也许您使用它的目的是其中一个匹配从目标中删除与某些附加条件匹配的记录,另一个匹配指定要更新的列列表,如果附加的逻辑测试是错误的)
如果您想在记录匹配时混合和匹配插入和更新,则需要使用其他东西,例如对更新做出反应的存储过程或触发器
或者,如果您只是询问合并语句的语法,则插入指令之前需要加上 WHEN NOT MATCHED THEN INSERT ...
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>;