我有以下触发器,但需要找到行的标识,所以我不更新表中的所有记录。如何获得受影响行的标识?
BEGIN
UPDATE tb_Division SET LastModified = GetDate() WHERE "id of inserted/updated row"
END
答案 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
DML触发器使用已删除和插入的逻辑(概念)表。它们在结构上类似于定义触发器的表,即尝试用户操作的表。已删除和已插入的表包含可由用户操作更改的行的旧值或新值。例如,要检索已删除表中的所有值,请使用:
答案 2 :(得分:0)
请注意 - 触发器可以同时处理大量行 - 您必须考虑到这一点!
您需要使用该ID字段上的Inserted
伪列加入您的表格进行更新:
UPDATE dbo.tb_Division
SET LastModified = GetDate()
FROM Inserted i
WHERE tb_Division.Id = i.Id
或类似的东西。