触发器中插入/更新行的标识

时间:2010-07-06 05:28:54

标签: sql-server-2005 tsql

我有以下触发器,但需要找到行的标识,所以我不更新表中的所有记录。如何获得受影响行的标识?

BEGIN
  UPDATE tb_Division SET  LastModified = GetDate() WHERE "id of inserted/updated row"
END

3 个答案:

答案 0 :(得分:16)

由于MS SQL Server中的触发器不区分单记录和多记录操作,因此您应该使用INSERTED伪表加入表或使用子选择:

UPDATE tb_Division
SET LastModified = GETDATE()
WHERE id IN (SELECT id FROM INSERTED)

id是表格的主键列。

答案 1 :(得分:4)

你看过inserted逻辑表的id了吗?使用触发器时必须小心,因为触发器可能在多行上运行:

UPDATE tb_Division AS td
   SET LastModified = GetDate() 
FROM INSERTED AS i
WHERE td.id = = i.id

有关详细信息,请参阅here,以及MSDN

  

DML触发器使用已删除和插入的逻辑(概念)表。它们在结构上类似于定义触发器的表,即尝试用户操作的表。已删除和已插入的表包含可由用户操作更改的行的旧值或新值。例如,要检索已删除表中的所有值,请使用:

答案 2 :(得分:0)

请注意 - 触发器可以同时处理大量行 - 您必须考虑到这一点!

您需要使用该ID字段上的Inserted伪列加入您的表格进行更新:

UPDATE dbo.tb_Division 
SET LastModified = GetDate() 
FROM Inserted i
WHERE tb_Division.Id = i.Id

或类似的东西。