2014-11-25 17 views
0

我是T-SQL觸發器的新手。我在表上執行一些觸發器,每次插入,更新和刪除進程表觸發器開始。T-SQL @@ FETCH不檢索多重刪除的最後一個值(插入或更新)

當一個刪除命令運行時,它可以正常工作,但是當一個sql命令內發生多重刪除時,它不會檢索最後刪除的行的id(顯示先前刪除的行id)。

例如,當我刪除4行與SQL命令,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 
+2

給出的答案是正確的。我只是有一個問題,爲什麼你在觸發器中使用光標?什麼是「SP_GD_GREENRAIN_CODES」呢?並且兩次調用SET NOCOUNT ON並不是必須的。一旦足夠 – Jaques 2014-11-25 09:06:43

+0

SP_GD_GREENRAIN_CODES是獲取Action參數(更新,刪除,插入)和一些其他參數(如ID,DESC等)的存儲過程,用於在特定表上運行I,U,D進程。 – balron 2014-11-25 09:41:22

回答

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是做什麼的,但是我非常肯定,它可以在整個刪除集中使用基於集合的操作,而不是單獨的每一行。

+0

感謝您提供info.I切換行。當我運行刪除命令,刪除表(總共有約11k行)相關的PK(Guid值)4行,SQL服務器進入像無限循環,我需要停止查詢,長達5分鐘以上。 – balron 2014-11-25 09:36:47

+0

@balron,在你做出改變之前,沒有無限循環? – DrCopyPaste 2014-11-25 09:52:36

+0

更改同一刪除查詢在一秒鐘內完成之前。 – balron 2014-11-25 11:08:19