我在这个SQL Server触发器中遇到问题,我希望在Devices
表上的每次插入后更新Mindframe
表上的信息,但是当我有两个以毫秒分隔的条目时,它给出一个错误,说它返回的值超过1。
有人可以解释我为什么吗?或指出我的错误......
触发
CREATE OR ALTER TRIGGER device_update
ON MindFrame
FOR INSERT
AS
BEGIN
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM INSERTED)
BEGIN
DECLARE @dev NVARCHAR(6)
DECLARE @lat NVARCHAR(45)
DECLARE @lng NVARCHAR(45)
DECLARE @bat FLOAT
SET @dev = (SELECT device from inserted)
SET @lat = (SELECT latitude from inserted)
SET @lng = (SELECT longitude from inserted)
SET @bat = (SELECT battery from inserted)
UPDATE Devices
SET lat = @lat, lng = @lng, bat = @bat, last_seen = GETDATE()
WHERE @dev = Devices.device
END
END
答案 0 :(得分:1)
您使用inserted
错误。它可以包含多行。它需要被视为表(或技术上的视图)。永远不要假设inserted
或deleted
只有一行。
触发器更容易以这种方式编写:
BEGIN
UPDATE d
SET lat = i.latitude,
lng = i.longitude,
bat = i.battery,
last_seen = GETDATE()
FROM inserted i JOIN
devices d
on i.device = d.device
END;
您不需要检查inserted
是否有行(如果没有,则不会更新任何内容)。您不需要定义局部变量。代码更短。 。 。它有效。