SQL 对 UPDATE 触发器中的每个更新行执行 INSERT

SQL perform INSERT for every updated row in UPDATE trigger

我有一个 AFTER UPDATE 触发器,它几乎总是一次针对多行执行。当发生这种情况时,它需要进行更新、删除和插入。对于 updates/deletes 我正在处理多行,如下所示:

DELETE lss
FROM dbo.Lab_SubSpace lss
JOIN Inserted i ON lss.Lab_Space_Id = i.id
WHERE i.Occupancy_Status_code = 'vacant' OR i.Status_Code IN ('retired', 'unknown');

我现在遇到的问题是,我还需要为更新的每一行插入另一个 table。除了使用游标遍历 Inserted table 然后执行 INSERT INTO 操作之外,我不确定如何处理它。所以像这样:

DECLARE c CURSOR 
FAST_FORWARD READ_ONLY LOCAL 
FOR SELECT i.id, i.Floor_Space_Area_Qty, sp.WWID
FROM Inserted i
JOIN dbo.Space_Planners sp ON i.Building_Location_Id = sp.LocationId
WHERE i.Status_Code NOT IN ('retired', 'unknown');

OPEN c

FETCH NEXT FROM c INTO @labSpaceId, @sqFt, @poc;

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO dbo.Lab_SubSpace (...)
    VALUES (@labSpaceId, @sqFt, @poc, ...);

    FETCH NEXT FROM c INTO @labSpaceId, @sqFt, @poc;
END

有没有更好的方法?

不用使用 cursor 遍历 inerted table 并一条一条插入记录,只需使用 insert...select:

INSERT INTO dbo.Lab_SubSpace (...)
SELECT i.id, i.Floor_Space_Area_Qty, sp.WWID
FROM Inserted i
JOIN dbo.Space_Planners sp 
    ON i.Building_Location_Id = sp.LocationId
WHERE i.Status_Code NOT IN ('retired', 'unknown');

你可以试试吗

INSERT INTO dbo.Lab_Subspace(<field1>, <field2>, <field3>)
SELECT i.id, i.Floor_Space_Area_Qty, sp.WWID
FROM Inserted i
JOIN dbo.Space_Planners sp ON i.Building_Location_Id = sp.LocationId
WHERE i.Status_Code NOT IN ('retired', 'unknown')