【发布时间】:2019-07-18 17:42:52
【问题描述】:
我有一个AFTER UPDATE 触发器,几乎总是一次针对多行执行。发生这种情况时,它需要进行更新、删除和插入。对于更新/删除,我正在处理多行,如下所示:
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');
我现在卡住的地方是,我还需要为更新的每一行插入另一个表。除了使用游标遍历Inserted 表然后执行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
有没有更好的办法?
【问题讨论】:
-
YES!!!! 触发器内的光标可能是你能做的最慢的事情! !请改用适当的、基于集合的方法....
标签: sql sql-server sql-server-2016 database-trigger