T-SQL @@ FETCH多次删除时不检索最后一个值(插入或更新)

时间:2014-11-25 08:53:51

标签: sql sql-server tsql

我是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

1 个答案:

答案 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做了什么,但我很确定无论它做什么,也可以使用基于集合的操作在整个已删除集上实现,而不是单独使用它的每一行。