2011-09-16 37 views
3

我有一個SQL Server 2000數據庫中。我需要運行下面的光標來觸發單個記錄上的觸發器(觸發器一次只能操作一條記錄)。問題與SQL Server 2000遊標未擷取NEXT

DECLARE @REC as bigint 

DECLARE coil1_cursor CURSOR FOR 
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 

OPEN coil1_cursor 
FETCH NEXT FROM coil1_cursor INTO @REC 

WHILE (@@FETCH_STATUS=0) 
BEGIN 
    Print @Rec 
    UPDATE coil1 SET ShiftLength=Null WHERE Rec#[email protected] 

    FETCH NEXT FROM coil1_cursor INTO @REC 
END 
CLOSE coil1_cursor 
DEALLOCATE coil1_cursor 

如果我註釋掉UPDATE行,我會按照預期從Rec#字段獲得序列號。如果我取消註釋UPDATE行,批處理進入無限循環。當我停止批處理時,它只顯示更新它所到達的第一條記錄。這就像FETCH NEXT卡住了。任何想法爲什麼?

+5

,只有在一個時間上的一個記錄操作的觸發需要重寫。 –

+0

您是否可以修復觸發器,以便在所有記錄「從插入」操作?如果是這樣,只需使用UPDATE SET COIL1 ShiftLength = NULL WHERE [時間戳] '之間2011-05-10 6時00分00秒' 與 '2011-05-10 7點○○分00秒'。我認爲你正試圖針對手頭的問題實施錯誤的解決方案。 – HardCode

+1

我曾經在一個觸發刪除光標和只有4條記錄插入接管45分鐘不到一分鐘去。在觸發器中使用遊標是非常糟糕的做法。 – HLGEM

回答

5

您正在使用默認光標選項(包括動態)。嘗試使用更有效的光標爲您的目的:

DECLARE coil1_cursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY 
FOR ... 

但對於真正的解決,喬是絕對正確的 - 這不應該是一個光標在所有。您可以使用單個更新語句完成同樣的事情。沒有光標,沒有無限循環,無需等待:

UPDATE coil1 
    SET ShiftLength = NULL 
    WHERE [Timestamp] BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 

(順便說一句,[Timestamp]是一個可怕的列名,因爲它代表了有無關日期或時間數據類型Rec#不是神話般的要麼。情況因人而異。)

+0

+1使用LOCAL並提供更新語句。 –

+0

我同意你的所有評論,但往往如此,我們必須使用發給我們的卡片。 LOCAL STATIC ...選項解決了這個問題。謝謝! – ccampj

+0

啊,我現在只是看到光標不在觸發器內,抱歉誤解。那麼,爲什麼外部代碼沒有清理觸發器未正確執行的垃圾?你可以詳細瞭解觸發器對一行的行爲,只是它應該對所有行做什麼? –

2

因爲你更新你的光標引用的表,你應該聲明光標爲靜態。

DECLARE coil1_cursor CURSOR STATIC FOR 
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 
+0

作爲一個側面說明,'INSENSITIVE'是'STATIC' –

+0

@Filip的代名詞,但它是這麼多的工作類型!而且更容易出現拼寫錯誤。 :-) –

+0

@Aaron你很不敏感 –