我刚刚开始使用SQL,并且一直在尝试设置触发器以自动填充一些列,例如下面为employeeTimes(clockIn,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
我得到的错误如下:
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
答案 0 :(得分:1)
Sql server中的触发器是基于语句而不是行来触发的
这意味着inserted
(和deleted
)可能包含多行。
通过编写SET @employeeID = (SELECT employeeID FROM inserted)
,您假设inserted
表中只有一行,但在单个语句中更新或插入多行时并非如此。
此外,您对employeeTimes
表 -
SELECT DATEDIFF(hh,clockIn,clockOut) FROM 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