SQL 服务器更新触发器在值为空时不更新列

SQL Server Update trigger not updating columns when value is null

我有一个更新触发器,当另一列 (col2) 更新为 2(从另一个值)时,将 +1 添加到行的数字列 (col1)。我正在尝试计算 col2 更新为 2 的次数。当 col1 不为 null 时,触发器工作正常,但我希望也能够处理 null 情况(将 null 视为 0)。

我认为合并函数 (coalesce(deleted.col1+1,1)) 可以工作,但如果列开始时为空,则该列仍为空。如果值不为空,它会 "work" 使用合并函数。

NOT NULL 条件也不适用于 null 情况。此外,第二个 UPDATE (SET col1=1) 带有一个 WHERE 子句,询问 deleted.col1 IS NULL 是否在 null 情况下不更新,所以我有点困惑。

关于问题是什么有什么想法吗?

代码:

CREATE TRIGGER schema1.trigger1 
ON schema1.table1 
FOR UPDATE
AS
    IF UPDATE(col2)
    BEGIN   
        UPDATE t 
        SET t.col1 = coalesce(d.col1+1,1)
        FROM schema1.table1 AS t
        INNER JOIN INSERTED AS i ON t.ID = i.ID
        INNER JOIN DELETED AS d ON i.ID = d.ID
        WHERE i.col2 = 2
          AND d.col2 != 2 
          AND i.col1 = d.col1;
       --WHERE...i.col1 = d.col1 added in case this column is being updated by user
END;

第一次 post 所以如果有什么我可以做的来改进我的问题,请不要犹豫让我知道。

您的问题出在 WHERE 子句中,而不是您的 COALESCE() 函数:

WHERE i.col2 = 2 AND d.col2 != 2 AND i.col1 = d.col1;

如果 d.col1 为 NULL,那里的第二个条件 (i.col1 = d.col1) 永远不会计算为 TRUE。

一种可能的解决方案是编写如下内容:

WHERE 
    i.col2 = 2 AND 
    d.col2 != 2 AND 
    (i.col1 = d.col1 OR (i.col1 IS NOT NULL AND d.col1 IS NULL)) ;