我正在使用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);
谢谢。
答案 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>;