sql server更新查询中的if条件

sql server更新查询中的if条件,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我有一个SQL server表,其中有两列,我希望根据与新值一起发送到存储过程的标志来更新它们的值,例如: UPDATE table_Name SET CASE WHEN @flag = '1' THEN column_A += @new_value WHEN @flag = '0' THEN column_B += @new_value END AS Total WHERE ID = @ID 执行此操作的正确SQL serv

我有一个SQL server表,其中有两列,我希望根据与新值一起发送到存储过程的标志来更新它们的值,例如:

UPDATE
    table_Name

SET
    CASE
        WHEN @flag = '1' THEN column_A += @new_value
        WHEN @flag = '0' THEN column_B += @new_value
    END AS Total

WHERE
    ID = @ID

执行此操作的正确SQL server代码是什么???

类似的代码应该可以工作:

UPDATE
    table_Name
SET 
  column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END,
  column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END
WHERE
    ID = @ID
UPDATE
    table_Name
SET 
  column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END,
  column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END
WHERE
    ID = @ID

由于您使用的是SQL 2008:

UPDATE
    table_Name

SET
    column_A  
     = CASE
        WHEN @flag = '1' THEN @new_value
        ELSE 0
    END + column_A,

    column_B  
     = CASE
        WHEN @flag = '0' THEN @new_value
        ELSE 0
    END + column_B 
WHERE
    ID = @ID
如果您使用的是SQL 2012:

UPDATE
    table_Name
SET
    column_A  = column_A + IIF(@flag = '1', @new_value, 0),
    column_B  = column_B + IIF(@flag = '0', @new_value, 0)
WHERE
    ID = @ID

当前的答案很好,应该可以正常工作,但更简单、更明显、更易于维护的答案有什么错:

IF @flag = 1
    UPDATE table_name SET column_A = column_A + @new_value WHERE ID = @ID;
ELSE
    UPDATE table_name SET column_B = column_B + @new_value WHERE ID = @ID;
尽管这是一个非常简单的查询,但它更容易阅读

下面是@snyder提供的一个工作示例:。

这非常有效:


为什么
+=
?您正在尝试将
@new_value
附加到列中已存在的内容?是的,这就是我需要条件更新代码的原因,因为根据标志,我将更新预期的值column@snyder. 谢谢,只是分号而已@flem-您不需要删除分号,只需更改右侧面板中的语句终止符即可。事实上,我不太喜欢这个答案,你必须写两次where子句和表名,如果整个查询比这个简单的查询更复杂,这可能很难维护example@RomanPekar. 这是一个公平的观点,也是我写“尽管这是一个非常简单的查询”的原因。这个答案的目的是为其他答案提供一个替代答案。与第三代编程语言不同,DRY不一定是SQL编程中的最佳实践。性能是这里的关键。OP应该考虑两个选项,并根据实际的查询做出明智的选择。如果更新的数量少,对于A和B的更新,查询是相同的,那么其他的答案是好的,但是如果我演示了我的代码,我就感觉不好。我怀疑我们在这里主要考虑的是“编程逻辑”而不是“设置逻辑”。我想知道一个真正的DBD会说什么。。。
DECLARE @JCnt int=null
SEt @JCnt=(SELECT COUNT( ISNUll(EmpCode,0)) FROM tbl_Employees WHERE EmpCode=1  )

UPDATE #TempCode
SET janCA= CASE WHEN @JCnt>0 THEN (SELECT SUM (ISNUll(Amount,0)) FROM tbl_Salary WHERE Code=1 )ELSE 0 END
WHERE code=1