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

cca*_*mpj 3 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
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*and 5

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

DECLARE coil1_cursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR ...
Run Code Online (Sandbox Code Playgroud)

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

UPDATE coil1 
   SET ShiftLength = NULL
   WHERE [Timestamp] BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00'
Run Code Online (Sandbox Code Playgroud)

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