Sql server SQL Server不断获取触发器的错误消息

Sql server SQL Server不断获取触发器的错误消息,sql-server,Sql Server,几天前,我刚开始使用SQL,并且一直在尝试设置触发器,以便在为employeeTimesclockIn、clockOut、timeIntimeOut输入数据时,自动填充一些列,例如下面的列,对于此处未列出的列,也是如此。抱歉,如果列/行名称混淆-请告诉我我会更改它。 下面是我的触发器,下面是错误 ALTER TRIGGER dailyHoursWorked ON employeeTimes AFTER INSERT, DELETE, UPDATE AS DECLARE @time INT DEC

几天前,我刚开始使用SQL,并且一直在尝试设置触发器,以便在为employeeTimesclockIn、clockOut、timeIntimeOut输入数据时,自动填充一些列,例如下面的列,对于此处未列出的列,也是如此。抱歉,如果列/行名称混淆-请告诉我我会更改它。 下面是我的触发器,下面是错误

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
我得到的错误如下:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


Sql server中的触发器是基于语句而不是行触发的。 这意味着插入和删除的行可能包含多行

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

另外,你对employeeTimes表也做了同样的假设-

如果表中有多行,则将返回结果集而不是单个值

在我看来,最好的方法是在从表中选择数据时使用计算列或计算所需的任何数据,而不是使用触发器

如果确实要为此使用触发器,可以使用update语句,并将其连接到插入的表,如下所示:

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

谢谢你,我会调查的。这是更简单的方法:-。不是做屁股。但这不是更简单的方法,这是正确的方法。触发器是基于设置的。如果你没有听说过术语集合库,我会花一周的时间每天花两个小时在谷歌上搜索和阅读sql server集合搜索结果。
UPDATE t
SET timeIntimeOut = DATEDIFF(hh, i.clockIn, i.clockOut)
FROM employeeTimes As t
INNER JOIN inserted as i ON t.employeeID = i.employeeID