我正在使用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;
有人可以帮我理解我的错误吗?
答案 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;