Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 匹配时在中使用多个语句_Sql_Sql Server_Tsql_Merge_Sql Update - Fatal编程技术网

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';
请记住,此方法有一些限制更多信息:

请显示第二个和第三个条件的代码(不管它是否运行,只要显示那里的逻辑即可)。可能相关(或重复)取决于此处真正询问的内容:请显示第二个和第三个条件的代码(不管它是否运行,只要显示那里的逻辑即可)。可能相关(或重复)取决于此处真正询问的内容:我修改了问题。此处我不能使用
。它显示语法错误。我