2011-10-05 84 views
2

我有一個SQL Server 2005遊標操作在名爲@workingSet的表變量上。從遊標源刪除行SQL Server

某些時候行可以相關,在這種情況下,我會同時處理我已讀取的行和相關的行。然後我從@workingset中刪除相關記錄,因爲我不需要在循環中進行處理。

在有7行的@workingSet中,前兩個是相關的,所以當我處理1時,我也處理2.我從光標源(@workingSet)中刪除第2行,然後取下一行。問題是它返回@workingset(我在前一次迭代中刪除的那一行)中的第二行。

我的印象是這樣做可以做到......即從光標操作的源中刪除一個項目,並且它將在隨後的提取中遵循刪除。

任何幫助非常感謝。

+1

你能告訴我們你在做什麼? **最好的**選項將完全消除光標 - 這可能在所有情況下至少有90%... –

+0

謝謝,是的,你是對的..我仍然不相信需要光標但更感興趣知道這是可能的。 –

回答

1

答案似乎是,用作遊標源的表變量需要有一個主鍵。我已經添加了這個和所有正常工作。

+0

我的答案中的表沒有PK,並正確反映了'DELETE'的結果。 –

+0

嗨..是的,我能夠做一個沒有PK的概念證明,它的工作是正確的。我不知道爲什麼在另一種情況下它需要它。 –

+0

您是否設置了其他光標選項? –

0

不是大量熟悉遊標,但是爲了快速測試,您需要避免使用STATICKEYSET選項來聲明遊標,然後對遊標進行底層表的更改。

SET NOCOUNT ON; 

DECLARE @WorkingTable TABLE(C int) 

INSERT INTO @WorkingTable VALUES (1),(2),(3) 

DECLARE @C int 

DECLARE wt_cursor CURSOR 
DYNAMIC /*Or left blank but not STATIC or KEYSET*/ 
FOR 
SELECT C 
FROM @WorkingTable 

OPEN wt_cursor; 

FETCH NEXT FROM wt_cursor 
INTO @C 

DELETE FROM @WorkingTable 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @C; 


    FETCH NEXT FROM wt_cursor 
    INTO @C; 
END 
CLOSE wt_cursor; 
DEALLOCATE wt_cursor; 
+0

謝謝..是的光標沒有用STATIC或KEYSET聲明。 –

+0

@Simon - 當你在我的答案中運行代碼時,你會得到什麼,但刪除'DYNAMIC'選項?對我來說,它只是返回'1'而不是'1,2,3' –