我有一个触发器的问题,我用它来实现过程。我使用插入表来收集用户更新和采购过程中的所有行。但对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
发布于 2018-12-17 22:32:48
我可能离得很远,但我想我已经很接近了。
现在,表单表被更新,然后存储过程运行。我猜存储过程在表单表上运行了一些工作。如果你想在每一行上运行它,看起来(我讨厌这么说),你需要一个游标。
您需要在第一次选择时创建一个游标,如下所示
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
我还没有机会测试它,所以可能需要一些修改才能让它运行。我不确定存储过程在做什么,但您需要确保它一次可以处理一条记录。最好不要使用存储过程,只写出代码,以确保它可以一次处理一行。
还请记住,有更好的方法可以做到这一点,但对于您的特定应用程序,在不了解体系结构的情况下,这是我认为最适合您的解决方案。
https://stackoverflow.com/questions/53815525
复制相似问题