SQL Server 2000游标无法获取下一个问题

时间:2011-09-16 14:18:46

标签: sql-server cursor

我有一个SQL Server 2000数据库。我需要运行以下光标来触发单个记录的触发器(触发器一次只能在一条记录上运行)。

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#=@REC

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

如果我注释掉UPDATE行,我会按预期从Rec#字段获取序列号。如果我取消注释UPDATE行,批处理将进入无限循环。当我停止批处理时,它只显示更新它获得的第一个记录。这就像FETCH NEXT卡住了。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您正在使用默认光标选项(包括动态)。尝试使用效率更高的游标:

DECLARE coil1_cursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR ...

但是对于真正的修复,Joe是绝对正确的 - 这根本不应该是光标。您可以使用单个更新语句完成相同的操作。没有光标,没有无限循环,没有等待:

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

(另外,[Timestamp]是一个可怕的列名,因为它代表的数据类型与日期或时间无关。Rec#也不是很棒.YMMV。)

答案 1 :(得分:2)

因为您正在更新光标引用的表,所以应将光标声明为STATIC。

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'