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)) ;
我有一个更新触发器,当另一列 (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)) ;