Sql 匹配时在中使用多个语句
我使用Sql 匹配时在中使用多个语句,sql,sql-server,tsql,merge,sql-update,Sql,Sql Server,Tsql,Merge,Sql Update,我使用MERGE语句将XML输入插入SQL Server数据库表。如何在匹配时在块中执行多个条件。请参考下面的代码 USING TableRelationship AS new ON (new.TableRelationshipTypeID = old.TableRelationshipTypeID) AND old.ToRoleID = @RoleID WHEN MATCHED THEN UPDATE SET old.FromRoleID = new.FromRo
MERGE
语句将XML
输入插入SQL Server数据库表。如何在匹配时在块中执行多个条件。请参考下面的代码
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
当前匹配时
仅执行此old.FromRoleID=new.FromRoleID
行。如果不匹配
条件,如何执行内的所有3行(--条件2和3
)
例:
这就是我所期望的匹配时
我只想更新旧字段(old.ThruDate=GETDATE()
),并在同一个表中插入一条记录。我不能用逗号把那些陈述分开。SQL发出
语法错误
谢谢。这些不是条件,它们是转让条款。您可以用逗号分隔它们,如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>;
将TableRelationship用作新关系
ON(new.TableRelationshipTypeID=old.TableRelationshipTypeID)和
old.ToRoleID=@RoleID
匹配后再更新
设置old.FromRoleID=new.FromRoleID,
,
;
这些不是条件,而是赋值子句。您可以用逗号分隔它们,如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>;
将TableRelationship用作新关系
ON(new.TableRelationshipTypeID=old.TableRelationshipTypeID)和
old.ToRoleID=@RoleID
匹配后再更新
设置old.FromRoleID=new.FromRoleID,
,
;
这不是merge语句的用途。merge语句要么更新已经存在的记录(匹配时),要么插入不存在的记录(不匹配时)。它的设计目的不是在找到匹配项时插入记录
(旁注:SQLServerMerge语句可以指定何时匹配两次,也许您使用它的目的是,其中一个匹配从目标中删除符合某些附加条件的记录,另一个指定在附加逻辑测试为false时要更新的列列表)
如果要在匹配记录时混合和匹配插入和更新,则需要使用存储过程或触发器等对更新作出反应的其他方法
或者,如果您只是询问合并语句的语法如何,则插入指令之前需要加上WHEN NOT MATCHED THEN insert…这不是合并语句的用途。merge语句要么更新已经存在的记录(匹配时),要么插入不存在的记录(不匹配时)。它的设计目的不是在找到匹配项时插入记录
(旁注:SQLServerMerge语句可以指定何时匹配两次,也许您使用它的目的是,其中一个匹配从目标中删除符合某些附加条件的记录,另一个指定在附加逻辑测试为false时要更新的列列表)
如果要在匹配记录时混合和匹配插入和更新,则需要使用存储过程或触发器等对更新作出反应的其他方法
或者,如果您只是询问merge语句的语法如何,您的insert指令需要在WHEN NOT MATCHED THEN insert…之前加上WHEN NOT MATCHED THEN insert…您不能这样做-SQL Server的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 }
合并
使用
[匹配时[和]
然后][…n]
;
::=
{更新集|删除}
MERGE语句最多可以有两个WHEN-MATCHED子句。如果两个
如果指定了子句,则第一个子句必须附有
和条款。对于任何给定行,当
仅当第一个未匹配时,才应用MATCHED子句。如果有两个
当匹配子句时,必须指定一个更新操作和一个
必须指定删除操作
您不能这样做-SQL Server的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 }
合并
使用
[匹配时[和]
然后][…n]
;
::=
{更新集|删除}
MERGE语句最多可以有两个WHEN-MATCHED子句。如果两个
如果指定了子句,则第一个子句必须附有
和条款。对于任何给定行,当
仅当第一个未匹配时,才应用MATCHED子句。如果有两个
当匹配子句时,必须指定一个更新操作和一个
必须指定删除操作
您可以使用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';
请记住,此方法有一些限制更多信息:
您可以使用插入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';
请记住,此方法有一些限制更多信息:
请显示第二个和第三个条件的代码(不管它是否运行,只要显示那里的逻辑即可)。可能相关(或重复)取决于此处真正询问的内容:请显示第二个和第三个条件的代码(不管它是否运行,只要显示那里的逻辑即可)。可能相关(或重复)取决于此处真正询问的内容:我修改了问题。此处我不能使用,
。它显示语法错误。我