为什么使用 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?
我在这里发现了几个类似的问题,我曾经尝试解决这个问题,但似乎对我没有任何帮助。 所以,基本上我有一个 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?