【发布时间】: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 也不太熟悉,所以如果有人对此过程有任何见解,将不胜感激。
为了澄清,我的问题是:
有什么方法可以有条件地UPDATE 或DELETE(或进行其他DML 操作)?
【问题讨论】:
-
我知道这听起来很挑剔,但您不删除字段,而是删除记录。如果要使字段没有值,请将其更新为 NULL。这很重要,因为从概念上讲,您可能需要在一个 if 块中进行多次更新,然后在 delete IF 块中只需要一次删除。因此,除非您想在其中一个字段发生更改时更新所有字段,否则您真的不应该考虑使用合并(反正不是粉丝,它有问题并且很难排除故障)
标签: sql sql-server sql-server-2008 dml