2017-05-03 75 views
0

我刚开始用SQL前几天一直在试图建立触发自动填充一些列,比如当输入employeeTimes(clockIn,CLOCKOUT,timeIntimeOut数据下面的那些)(类似于这里没有列出的)。对不起,如果列/行名称令人困惑 - 请让我知道我会改变它。 下面是我的触发器,下面是错误。SQL服务器也能收到错误消息触发

ALTER TRIGGER dailyHoursWorked 
ON employeeTimes 
AFTER INSERT, DELETE, UPDATE 
AS 
DECLARE @time INT 
DECLARE @employeeID INT 
DECLARE @error VARCHAR(30) 
SET @time = (SELECT DATEDIFF(hh,clockIn,clockOut) FROM employeeTimes) 
SET @employeeID = (SELECT employeeID FROM inserted) 
SET @error = ('Please enter an employeeID') 
BEGIN 
UPDATE employeeTimes 
SET [email protected] 
Where [email protected] 
END 

我得到的错误如下:

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

回答

1

触发器在SQL服务器被解雇根据声明,不是行。
这意味着inserted(和deleted)可能包含多行。

通过编写SET @employeeID = (SELECT employeeID FROM inserted)您假定inserted表中只有一行,但在单个语句中更新或插入多行时并非如此。

此外,我们假定你是同样的事情有关employeeTimes表 -

SELECT DATEDIFF(hh,clockIn,clockOut) FROM employeeTimes 

将返回结果集,而不是一个单一的值,如果你的表有更多然后一行。

我看来,像去这里最好的办法是要么使用计算列或计算的任何数据从您选择表中的数据时,而不是使用触发器需要它。

如果你真的想用这个触发器,您可以使用更新语句和加入到这样inserted表:

UPDATE t 
SET timeIntimeOut = DATEDIFF(hh, i.clockIn, i.clockOut) 
FROM employeeTimes As t 
INNER JOIN inserted as i ON t.employeeID = i.employeeID 
+0

谢谢你,我会考虑它。这很容易:-)。 – kevoid

+0

不是一个屁股..但它不是“更容易”的方式,它是正确的方式。触发器是基于集合的。如果你(OP)没有听说过“set base”这个术语,那么我会每天花2个小时在一个星期内搜索一下“基于sql server set”的搜索结果。 – granadaCoder