首页 > 解决方案 > 仅当任何其他列更改时才更新一列

问题描述

我正在尝试在 SQL Server 上创建一个更新语句以将其中一张卡设置为默认值,而将其他所有卡设置为默认值,但是,如果我有 3 张卡和卡 1 设置为默认值,现在我想将卡 2 设置为默认值我将所有 3 张卡片设置为更新,而我应该只设置卡片 1 和 2。我目前正在使用以下查询:

UPDATE Card
  SET                     
     ModifiedDateTimeUtc = @ModifiedDateTimeUtc,
     IsDefault = CASE WHEN Id = @CardId THEN 1 ELSE 0 END
  WHERE CustomerId = @CustomerId;

我需要修改此查询,以便只有值更新的卡片才能设置新的修改日期/时间。

PS,我不能在这个数据库上使用触发器(很遗憾),所以我需要使用“简单”的 SQL 语句找到解决方案。

标签: sqlsql-serversql-update

解决方案


也许它可以用其他方式编写,但你可以这样做:

UPDATE Card
SET                     
    ModifiedDateTimeUtc = 
    CASE WHEN Id = @CardId THEN 
        CASE WHEN IsDefault = 1 THEN ModifiedDateTimeUtc ELSE @ModifiedDateTimeUtc END 
    ELSE
        CASE WHEN IsDefault = 0 THEN ModifiedDateTimeUtc ELSE @ModifiedDateTimeUtc END 
    END,
    IsDefault = CASE WHEN Id = @CardId THEN 1 ELSE 0 END
WHERE CustomerId = @CustomerId;

应该怎么做?如果 Id 与参数相同,且更新前的旧值为 1,则 datetime 相同,不进行更新,否则(表示旧值 = 0)则更新。旧值 = 0 也是如此...


推荐阅读