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')
我有一个 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')