【问题标题】:Using conditional to Update OR Delete使用条件更新或删除
【发布时间】:2015-11-18 08:07:15
【问题描述】:

我编写了一个存储过程,它使用OUTPUT deleted.* 更新表,然后将旧记录写入历史表

我现在希望更新该过程并包含一个@option 参数,该参数将为1 或2。如果选项为1,则将更新目标表中的记录。如果是 2,那么它们将从表中删除。

有没有办法写一个条件来根据这个输入参数更新或插入?我可以写成

IF @option = 1
BEGIN
  ...updates...
END

IF @option = 2
BEGIN
  ...deletes...
END

但是有很多字段被更新/删除,并且这个过程重复了三遍,所以我试图让它更简洁。

我尝试过(CASE @option WHEN 1 THEN UPDATE WHEN 2 THEN DELETE) table1 ...,但那是不正确的 SQL。我考虑过使用MERGE 并包括条件,例如WHEN MATCHED AND @option = 1 THEN,但在那里出现语法错误。我对MERGE 也不太熟悉,所以如果有人对此过程有任何见解,将不胜感激。

为了澄清,我的问题是:

有什么方法可以有条件地UPDATEDELETE(或进行其他DML 操作)?

【问题讨论】:

  • 我知道这听起来很挑剔,但您不删除字段,而是删除记录。如果要使字段没有值,请将其更新为 NULL。这很重要,因为从概念上讲,您可能需要在一个 if 块中进行多次更新,然后在 delete IF 块中只需要一次删除。因此,除非您想在其中一个字段发生更改时更新所有字段,否则您真的不应该考虑使用合并(反正不是粉丝,它有问题并且很难排除故障)

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


【解决方案1】:

MERGE 通过插入不存在的记录并更新存在的记录来工作,这是一种常见的情况。即便如此,它并不比单独的 INSERTUPDATE 语句更简洁,因为您仍然必须单独提供语句(只需包装在单个 MERGE 语句中。

根据我的经验,有条件地更新或删除不是一种常见的情况,因此没有简洁的 SQL 语法可以做到这一点。

我会注意到DELETE 中没有指定字段,因此无论如何语法都有一些差异。我认为有一个分隔UPDATEDELETEif 块将尽可能简洁。

【讨论】:

  • 我用两个IF写出来的,真的没有多少空间可以节省。谢谢解释
猜你喜欢
  • 2019-11-01
  • 2018-11-20
  • 2011-11-06
  • 2016-08-16
  • 2017-08-16
  • 2018-02-06
  • 1970-01-01
  • 2019-07-09
相关资源
最近更新 更多