触发子查询返回多个值

时间:2018-04-28 11:27:02

标签: sql sql-server triggers

我在这个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

1 个答案:

答案 0 :(得分:1)

您使用inserted错误。它可以包含多行。它需要被视为(或技术上的视图)。永远不要假设inserteddeleted只有一行。

触发器更容易以这种方式编写:

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是否有行(如果没有,则不会更新任何内容)。您不需要定义局部变量。代码更短。 。 。它有效。