我几天前才从SQL开始,并一直在尝试设置触发器以自动填充某些列,例如在输入数据以for homplyeetimes时(clockin,timeinTimeTimeT,((类似于此处未列出的人(。抱歉,如果列/行名称令人困惑 - 请让我知道我会更改它。下面是我的触发器,下面是错误。
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 timeIntimeOut=@time
Where employeeID=@employeeID
END
我遇到的错误如下:
子查询返回超过1个值。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式时。
SQL Server中的触发器是根据语句而不是行触发的。
这意味着inserted
(和deleted
(可能包含多个行。
通过编写SET @employeeID = (SELECT employeeID FROM inserted)
,您假设inserted
表中只有一个行,但是在更新或插入多个行中的单个语句中并非如此。
另外,您还假设有关employeeTimes
表的同样事情 -
SELECT DATEDIFF(hh,clockIn,clockOut) FROM employeeTimes
如果您的表具有比一行更多的结果返回结果集,而不是单个值。
在我看来,去这里的最佳方法是使用计算的列或计算从表中选择数据时所需的任何数据,而不是使用触发器。
如果您真的想对此使用触发器,则可以使用与此类插入表的加入的更新语句:
UPDATE t
SET timeIntimeOut = DATEDIFF(hh, i.clockIn, i.clockOut)
FROM employeeTimes As t
INNER JOIN inserted as i ON t.employeeID = i.employeeID