sql server—当sql中只有一条记录时,游标会多次运行

baubqpgj  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(532)

我对一个游标有一个问题,在某些情况下,它只填充了一个值,而不是直接存在,它一直运行,直到崩溃。
代码如下:

DECLARE @positionID as INT
            DECLARE position_cursor CURSOR FOR 
            SELECT  positionUniqueNumber 
            FROM  position
            WHERE position.EmployeeID = @EmployeeID

            OPEN position_cursor  
            FETCH NEXT FROM position_cursor INTO @positionID  

            WHILE @@FETCH_STATUS = 0  
            BEGIN  
                    UPDATE   position
                    SET  positionFromDate = DATEADD(day,@days, positionFromDate)
                    WHERE position.positionUniqueNumber = @positionID

                  FETCH NEXT FROM position_cursor INTO @positionID 
            END 

            CLOSE position_cursor  
            DEALLOCATE position_cursor

如果“position\u cursor”只有一个值,我希望光标在一次运行后仍然存在,相反,它会一直运行,直到它试图设置一个高于9999的日期,然后崩溃。我的一个解决方法是检查表中有多少条符合条件的记录,并且仅当有1条以上的记录时才使用游标,但我希望找到更好的方法。思想?谢谢

btxsgosb

btxsgosb1#

这是一个修复程序。大多数人期望游标具有静态语义,但这不是默认的。如果更新导致行在游标读取的索引中移动,则可以读取同一行两次。
只要始终将游标声明为本地静态,就可以避免这些问题。

drop table if exists position
go
create table position(positionuniquenumber int primary key nonclustered, EmployeeId int, positionFromDate DateTime)
create unique clustered index cix_position on position(employeeid,positionFromDate,positionuniquenumber)

insert into position(positionuniquenumber,EmployeeId,positionFromDate) values (1,1,getdate())
go
DECLARE @EmployeeID int = 1
declare @Days int = 1
DECLARE @positionID as INT
DECLARE position_cursor CURSOR /*LOCAL STATIC*/ FOR 
SELECT  positionUniqueNumber 
FROM  position
WHERE position.EmployeeID = @EmployeeID

OPEN position_cursor  
FETCH NEXT FROM position_cursor INTO @positionID  

WHILE @@FETCH_STATUS = 0  
BEGIN  
        UPDATE   position
        SET  positionFromDate = DATEADD(day,@days, positionFromDate)
        WHERE position.positionUniqueNumber = @positionID

        FETCH NEXT FROM position_cursor INTO @positionID 
END 

CLOSE position_cursor  
DEALLOCATE position_cursor

相关问题