为什么使用 SQL UPDATE() 函数和 Inserted table 在更新触发器后不起作用?

Why using SQL UPDATE() function along with Inserted table is not working in this after update trigger?

我在这里发现了几个类似的问题,我曾经尝试解决这个问题,但似乎对我没有任何帮助。 所以,基本上我有一个 Pallet table,当 Loaded 字段更改为值 <> 或 <> 更改为 NULL 时,我需要更改 Status 字段,并且地位也不一样。触发器基本上什么都不做。所以,我有:

ALTER TRIGGER [dbo].[TR_Status_Change]
   ON [dbo].[Pallet]
   AFTER UPDATE
AS BEGIN

    SET NOCOUNT ON;
    IF UPDATE (Loaded)
    BEGIN
        UPDATE [Pallet] 
        SET PStatus = 3
        FROM [Pallet] P 
        INNER JOIN Inserted I ON P.ID = I.ID
        WHERE P.PStatus <> 3
            AND P.Loaded <> I.Loaded
            AND I.Loaded IS NOT NULL
    END
END

其中 ID 为主键。行值如下:

before update: Loaded = NULL, Status = 1

after: Loaded = 'somevalue' and Status remains = 1

expected: Status = 3

提前致谢。

事情是这样的: P.Loaded <> I.Loaded

这永远不会是真的,因为您正在比较 table 更新后的数据([Pallet P])与... table 更新后的数据更新(插入 I)。

我想你想将 Inserted I 更改为 deleted table,它保存更新操作之前的值。

"Something compared to NULL" 比较总是错误的,所以失败了

AND P.Loaded <> I.Loaded

试试这个。您也需要 "before" 和 "after" 值的 Loaded

UPDATE [Pallet] 
    SET PStatus = 3
    FROM [Pallet] P 
    INNER JOIN Deleted D ON P.ID = D.ID
    INNER JOIN Inserted I ON P.ID = I.ID
    WHERE P.PStatus <> 3
        AND NOT EXISTS (SELECT I.Loaded INTERSECT SELECT D.Loaded)
        AND I.Loaded IS NOT NULL

INTERSECT 在内部进行 "is different from" 比较,而不是相等。如果它们不同,则交集不给出任何行,因此 NOT EXISTS 给出 true

有关 INTERSECT 和 EXCEPT 的更多信息,请在此处查看我的回答 Why does EXCEPT exist in T-SQL?