如何在同一个表的UPDATE触发器中更新表中的列?

时间:2017-12-29 13:54:10

标签: sql-server

以下是我的表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

我应该如何做这项工作?

1 个答案:

答案 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;