我有一个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卡住了.有什么想法吗?
您正在使用默认光标选项(包括动态).尝试使用更高效的光标用于您的目的:
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.)
| 归档时间: |
|
| 查看次数: |
3592 次 |
| 最近记录: |