当value为null时,SQL Server Update不会更新列

时间:2015-12-04 17:05:06

标签: triggers azure-sql-database sql-server-2014

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

我认为合并函数(coalesce(deleted.col1+1,1))可以工作,但如果列开始为null,则列保持为null。它确实"工作"如果值不为null,则使用coalesce函数。

NOT NULL条件也不适用于空案例。另外,第二个UPDATE(SET col1=1)带有一个WHERE子句,询问deleted.col1 IS 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;

第一次发布,如果有任何我可以做的改进我的问题,请不要犹豫,让我知道。

1 个答案:

答案 0 :(得分:2)

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

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

如果d.col1为空,则第二个条件(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)) ;