我是T-SQL触发器的新手。我正在一个表上实现一些触发器,在每个插入,更新和删除表触发器的过程开始。
当单个删除命令运行时,它只是工作,但是当在一个sql命令中发生多次删除时,它不会检索最后删除的行的id(显示先前删除的行id)。
例如,当我使用sql命令删除4行时,PRINT(触发器上)显示ID如下:
-Value 1 (First deleted row id)
-Value 2 (Second deleted row id)
-Value 3 (Third deleted row id)
-Value 3 (**WRONG!!!** Again, Third deleted row id )(Should see last row id here)
这是删除触发器:
ALTER TRIGGER [dbo].[TRG_GD_GREENRAIN_CODES_LOG_DELETE]
ON [dbo].[GD_GREENRAIN_CODES]
AFTER DELETE
AS
DECLARE @CODEID uniqueidentifier;
DECLARE @COUNT int;
SET @COUNT=(SELECT count(1) FROM deleted);
DECLARE contact_cursor CURSOR FOR
SELECT T.CODEID FROM deleted T
set NOCOUNT ON
OPEN contact_cursor;
FETCH NEXT FROM contact_cursor
INTO @CODEID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET NOCOUNT ON
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM contact_cursor
INTO @CODEID;
PRINT @CODEID
EXEC [dbo].[SP_GD_GREENRAIN_CODES] @CODEID,NULL,NULL,'D'
END
CLOSE contact_cursor;
DEALLOCATE contact_cursor;
GO
答案 0 :(得分:1)
您正在致电
FETCH NEXT FROM contact_cursor
INTO @CODEID;
。 通常在使用游标时,您只需在循环外执行一次,然后在迭代结束时每次迭代执行一次,但是在循环开始时使用它。
我认为在这种特殊情况下,如果您只是使用前面提到的行切换以下两行,就可以修复它。
PRINT @CODEID
EXEC [dbo].[SP_GD_GREENRAIN_CODES] @CODEID,NULL,NULL,'D'
旁注:我强烈建议坚持基于集合的操作,而不是试图通过强制它在单行上工作来将业务逻辑压缩到sql中。我不知道SP_GD_GREENRAIN_CODES
做了什么,但我很确定无论它做什么,也可以使用基于集合的操作在整个已删除集上实现,而不是单独使用它的每一行。