【问题标题】:SQL Server MERGE command - how to trap if nothing qualifiedSQL Server MERGE 命令 - 如果没有任何条件,如何进行陷阱
【发布时间】:2011-05-24 11:40:48
【问题描述】:

使用此命令,我们可以指定如下内容:

WHEN MATCHED AND stm.StudentMarks > 250 THEN DELETE

但是如果记录符合条件,我们如何捕获呢?例如,说 stm.StudentMarks = 100?如果我尝试“ELSE”,则会出现语法错误。

我知道这个命令通常不会以这种方式使用。但如果它能做到这一点,我就不必使用事务、锁和多个 SQL 语句了。

【问题讨论】:

    标签: sql-server sql-server-2008 merge dml


    【解决方案1】:

    试试:

    WHEN NOT MATCHED ....... THEN ......
    

    要在源中找到那些在目标中没有等效项的行(基于您指定的ON .... 条件),否则,您需要指定更多/其他表达式,例如

    WHEN MATCHED AND stm.StudentMarks <= 250 THEN .....
    

    【讨论】:

    • 谢谢。不幸的是,这行不通。它不会捕获匹配但不是子句搜索条件谓词。我也刚刚通过反复试验发现“在 MERGE 语句的 'WHEN NOT MATCHED' 子句中不允许使用 'UPDATE' 类型的操作。”显然 MERGE 有非常具体的用途,而我想要的不仅仅是它们。交易和锁定必须如此。
    【解决方案2】:

    基于进一步的学习,我得出的结论是,这样做的方法是使用视图/TVF 来获取正确的数据集。一个可以获得符合“IF ... THEN ...”的记录,另一个可以获得符合 ELSE 的记录。它只会运行两个 MERGE 语句,这没什么大不了的。

    【讨论】:

      【解决方案3】:

      稍等

      WHEN MATCHED THEN 
      

      如果没有任何额外的条件,它只会触发一个 when 子句,因为第一个获得所有与条件匹配的,第二个只会获得那些匹配除条件之外的所有条件。

      【讨论】:

      • 每种谓词类型只能有 1 个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 2011-04-04
      • 2019-04-13
      • 2010-09-23
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多