2011-10-05 48 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' –