Sql server 不';在SQL Server 2008中更新结果行时,不要停止游标循环
我想将Sql server 不';在SQL Server 2008中更新结果行时,不要停止游标循环,sql-server,cursor,Sql Server,Cursor,我想将Driver表的DriverID列设置为50005001 为此,我编写了以下脚本: use WeighbridgeDB GO DECLARE @NewDriverID int; SET @NewDriverID = 5000; DECLARE Driver_Cursor CURSOR FOR SELECT DriverID FROM Driver FOR UPDATE; OPEN Driver_Cursor; FETCH NEXT FROM Driver_Cursor WHIL
Driver
表的DriverID
列设置为50005001
为此,我编写了以下脚本:
use WeighbridgeDB
GO
DECLARE @NewDriverID int;
SET @NewDriverID = 5000;
DECLARE Driver_Cursor CURSOR FOR
SELECT DriverID FROM Driver
FOR UPDATE;
OPEN Driver_Cursor;
FETCH NEXT FROM Driver_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Driver SET DriverID = @NewDriverID WHERE CURRENT OF Driver_Cursor;
SET @NewDriverID += 1;
FETCH NEXT FROM Driver_Cursor
END
CLOSE Driver_Cursor;
DEALLOCATE Driver_Cursor;
GO
但是While循环不会停止,@@FETCH\u STATUS
的值始终为0。我认为游标会自我重建,因为更新发生在表或其他地方
如何纠正这种情况
谢谢。无论如何,您不需要光标(一般来说,在TSQL中尽量避免使用光标,只有极少数情况除外)
无论如何,您都不需要光标(一般来说,在TSQL中尽量避免使用光标,只有极少数情况除外)
您可以这样做:
UPDATE Driver
SET
Driver.DriverID = d.NewDriverID
FROM
(
select
ROW_NUMBER() Over (ORDER BY DriverID) + 5000 AS NewDriverID,
Driver.DriverID
from Driver
) AS d
WHERE Driver.DriverID = p.DriverID
几乎没有理由使用光标。您可以这样做:
UPDATE Driver
SET
Driver.DriverID = d.NewDriverID
FROM
(
select
ROW_NUMBER() Over (ORDER BY DriverID) + 5000 AS NewDriverID,
Driver.DriverID
from Driver
) AS d
WHERE Driver.DriverID = p.DriverID
几乎没有理由使用光标。我猜您错过了从驱动程序获取后的下一步_cursor@PrashantLakhlani-您不需要将
转换为。这意味着该行将被发送到连接的客户端。由于OP并没有试图使用当前行中的任何值,所以它显然没有错。我猜您错过了从驱动程序获取下一个值之后的操作_cursor@PrashantLakhlani-您不需要将转换为。这意味着该行将被发送到连接的客户端。由于OP没有试图使用当前行中的任何值,所以它显然没有错。