以下是我的表Table1
中的列:
Id(identity), Field1(VARCHAR), Field2(VARCHAR), Field3(CHAR)
我触发了此表的Field1
更新:
CREATE TRIGGER [dbo].[My_TRG] ON [dbo].[Table1]
FOR UPDATE
NOT FOR REPLICATION
AS
DECLARE @Id INT...
.....
.....
BEGIN
.....
SELECT @Id = Id FROM Inserted
UPDATE [Table1] SET [Field3] = 'NEW' WHERE [Field3] IS NULL AND Id=@Id
.....
.....
END
因此,我正在更新同一个表的其他列,以便在UPDATE触发器中更新相同的记录。上述触发器中的@Id
是正在更新的记录的标识符。
UPDATE语句之前没有,触发器工作正常。现在,我必须在触发器中添加UPDATE语句。
抛出以下异常:
无法找到行进行更新。自上次读取以来,某些值可能已更改。
我无法为Field3
设置默认值。 Field3
仅在Field1
设置时才有价值。否则,它应该是null
。
我应该如何做这项工作?
答案 0 :(得分:1)
您的触发器应该更新所有行,而您的代码(如果您使用它)将只更新1行,因此您需要将表与INSERTED
表连接,并使用CASE
expressin来检查是Column3 IS NOT NULL
并将NULL
值替换为'NEW'
:
UPDATE Tbl
SET Column1 = I.Column1,
Column2 = I.Column2,
Column3 = (CASE WHEN I.Column3 IS NOT NULL THEN 'NEW' END)
FROM Table1 Tbl INNER JOIN INSERTED I ON Tbl.ID = I.ID;