2014-09-06 82 views
0

我正在研究SQL Server 2008中的一个小型数据库来跟踪员工更改。我现在遇到了插入触发器的问题。我想要发生的事情是,当“记录”插入到记录表中时,它会为该雇员(EmpID)找到以前的开放记录(即没有结束日期的记录)(如果有),并用一个EndDate - 将在插入的StartDate前一天计算。这里是我试过的,没有成功:SQL插入触发器 - 更新其他记录

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 [email protected] 
WHERE [email protected] AND RealEnd=NULL; 

有人能帮我理解我的错误吗?

+0

首先,从'插入我选择@的EmpID = i.EmpID;'和'从插入的I选择@的StartDate = i.RealStart;'可以用'@的EmpID =被包装在单个查询我.EmpID,@ StartDate = i.RealStart'。然后,看起来你错过了** UPDATE **语句中的某些内容。如果我得到了正确的答案,则必须将** RealEnd **字段设置为** @ EndDate **值,而不是** NULL **。最后,你不能说'RealEnd = NULL',你必须使用'RealEnd IS NULL'来代替。更新可能是'UPDATE dbo.Record SET RealEnd = @ EndDate WHERE EmpID = @ EmpID AND RealEnd IS NULL;' – 2014-09-06 02:30:46

+0

谢谢亚历山德罗。实际上我几分钟前意识到我在使用= NULL而不是IS NULL时犯的错误。愚蠢的菜鸟错误。 – Boone 2014-09-06 02:55:05

回答

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;