我有一个SQL Server 2005游标在名为@workingSet
的表变量上运行。
有时行可以相关,在这种情况下,我会同时处理我提取的行和相关的行。然后我从@workingset
删除相关记录,因为我不需要在循环中处理。
在包含7行的@workingSet
中,前两个是相关的,所以当我处理1时我也处理2.我从游标源(@workingSet
)中删除第2行,然后获取下一个。问题是它返回@workingset
中的第二行(我在上一次迭代中删除的那一行)。
我的印象是这可以完成..即从光源操作的源中删除一个项目,它将在后续提取中遵守删除。
非常感谢任何帮助。
答案 0 :(得分:1)
答案似乎是用作游标源的表变量需要有一个主键。我添加了这个并且一切正常。
答案 1 :(得分:0)
不是很熟悉游标,但是从快速测试到此结果,您需要避免使用STATIC
或KEYSET
选项声明游标,然后对基础表的更改将反映在游标中。 / 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;