我有一个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卡住了。有什么想法吗?
答案 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'