从游标源SQL Server中删除行

时间:2011-10-05 13:38:27

标签: sql-server sql-server-2005 cursor delete-row

我有一个SQL Server 2005游标在名为@workingSet的表变量上运行。

有时行可以相关,在这种情况下,我会同时处理我提取的行和相关的行。然后我从@workingset删除相关记录,因为我不需要在循环中处理。

在包含7行的@workingSet中,前两个是相关的,所以当我处理1时我也处理2.我从游标源(@workingSet)中删除第2行,然后获取下一个。问题是它返回@workingset中的第二行(我在上一次迭代中删除的那一行)。

我的印象是这可以完成..即从光源操作的源中删除一个项目,它将在后续提取中遵守删除。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

答案似乎是用作游标源的表变量需要有一个主键。我添加了这个并且一切正常。

答案 1 :(得分:0)

不是很熟悉游标,但是从快速测试到此结果,您需要避免使用STATICKEYSET选项声明游标,然后对基础表的更改将反映在游标中。 / p>

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;