SQL Server触发器可以处理多行更新

时间:2018-12-17 12:44:16

标签: sql-server

我对用于过程实现的触发器有问题。我使用插入的表来收集用户更新并执行过程的所有行。但是程序将分别针对ech行重复。该如何处理?

我的触发器:

ALTER TRIGGER [dbo].[FormUpdate] 
 ON [dbo].[FORM]
   For UPDATE
AS 

BEGIN

    SET NOCOUNT ON;
    select * into #inserted from (
    SELECT i.* from FORM gw
    inner join inserted i on  gw.FORMID = i.FORMID) t
     WHERE t.PREPARING <> 0


    IF (SELECT COUNT(*) FROM #inserted) > 0
    BEGIN
        UPDATE GW 
        SET PREPARING = 0
        FROM FORM GW
            INNER JOIN #inserted on GW.FORMID = #inserted.FORMID

    EXEC dbo.PREPARING_OF_THE_FORM

    END
END

1 个答案:

答案 0 :(得分:0)

我可能还很遥远,但我认为我已经很近了。

现在看起来,Form表已更新,然后存储过程运行。我猜存储过程在窗体表上运行一些工作。如果要在每一行上都运行它(我讨厌这样说),则需要一个CURSOR。

您首先需要从

之类的对象中创建一个光标
 select * into #inserted from (
SELECT i.* from FORM gw
inner join inserted i on  gw.FORMID = i.FORMID) t
 WHERE t.PREPARING <> 0

DECLARE CURSOR inserted_Cursor
FOR

SELECT * 
FROM #inserted

OPEN inserted_cursor

FETCH NEXT FROM inserted_cursor

WHILE @@FETCH_STATUS = 0
BEGIN 
    UPDATE GW 
    SET PREPARING = 0
    FROM FORM GW
        INNER JOIN #inserted on GW.FORMID = #inserted.FORMID
EXEC dbo.PREPARING_OF_THE_FORM

FETCH NEXT FROM inserted_cursor
END

CLOSE inserted_cursor
DEALLOCATE inserted_Cursor

我没有机会进行测试,因此可能需要一些时间才能使其运行。我不确定存储过程在做什么,但是您需要确保该存储过程一次可以处理一个记录。最好不要使用存储过程,而只是写出代码以确保它可以一次处理一行。

也请记住,有更好的方法可以执行此操作,但是对于您的特定应用程序,并且不了解体系结构,这是我认为最适合您的解决方案。

相关问题