问题与SQL Server 2000游标不抓取NEXT



我有一个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卡住了。知道为什么吗?

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

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)。

因为要更新游标所引用的表,所以应该将游标声明为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'

最新更新