我对用于过程实现的触发器有问题。我使用插入的表来收集用户更新并执行过程的所有行。但是程序将分别针对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
答案 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
我没有机会进行测试,因此可能需要一些时间才能使其运行。我不确定存储过程在做什么,但是您需要确保该存储过程一次可以处理一个记录。最好不要使用存储过程,而只是写出代码以确保它可以一次处理一行。
也请记住,有更好的方法可以执行此操作,但是对于您的特定应用程序,并且不了解体系结构,这是我认为最适合您的解决方案。