SQL插入触发器 - 更新其他记录

时间:2014-09-06 01:48:18

标签: sql sql-server triggers insert

我正在使用SQL Server 2008中的小型数据库来跟踪员工的变化。我目前在插入触发器方面遇到问题。我想要发生的是,当一个"记录"如果有一个Employee(EmpID),它将被插入到记录表中,它会找到该员工(EmpID)的先前打开记录(即没有结束日期的记录),并使用EndDate更新它 - 它将在插入前一天计算开始日期。这是我尝试过的,但没有成功:

CREATE TRIGGER [dbo].[trgInsertRecord] ON [dbo].[Record]
FOR INSERT
AS

declare @EmpID int;
declare @StartDate date;
declare @EndDate date;

select @EmpID=i.EmpID from inserted i;
select @StartDate=i.RealStart from inserted i;
set @EndDate=DATEADD(DAY,-1,@StartDate)

UPDATE Record
SET RealEnd=@EndDate
WHERE EmpID=@EmpID AND RealEnd=NULL;

有人可以帮我理解我的错误吗?

1 个答案:

答案 0 :(得分:0)

假设给定的EmpID和NULL RealEnd只存在一行,您可以加入插入的表以进行更新操作,如下例所示。最佳实践是将触发器编码为处理由单个语句更新的多个行,因此您应该避免触发器中的本地标量子查询。

CREATE TRIGGER [dbo].[trgInsertRecord] ON [dbo].[Record]
FOR INSERT
AS

UPDATE r
SET RealEnd = DATEADD(DAY, -1, i.RealStart)
FROM Record AS r
JOIN inserted AS i ON
    r.EmpID=i.EmpID
    AND RealEnd IS NULL;