Это ошибка с ошибкой.Вот лучший способ перебора курсора без дублирования кода:
USE Northwind
GO
DECLARE myCursor CURSOR
FOR SELECT TOP(10) ContactName FROM Customers
DECLARE @RowNo int,@ContactName nvarchar(30)
SET @RowNo=0 -- initialize counters at zero, increment after the fetch/break
OPEN myCursor
WHILE 1=1 BEGIN -- start an infinite loop
FETCH NEXT FROM myCursor INTO @ContactName
IF @@FETCH_STATUS <> 0 BREAK
SET @RowNo=@RowNo+1
PRINT LEFT(CAST(@rowNo as varchar) + ' ',6)+' '+ @ContactName
END
CLOSE myCursor
DEALLOCATE myCursor
Для дополнительных точек используйте переменную курсора и объявите w / FAST_FORWARD и TYPE_WARNING или STATIC для небольших наборов данных.Например:
DECLARE @cursor CURSOR
SET @cursor = CURSOR FAST_FORWARD TYPE_WARNING FOR
SELECT TOP (10) ContactName FROM Customers
OPEN @cursor
......
CLOSE @cursor
DEALLOCATE @cursor
ЗАКРЫТЬ и ДЕЛАЛОКАТ не являются строго необходимыми, так как переменная курсора выйдет из области видимости в конце пакета.Однако это все еще хорошая форма, так как вы можете добавить больше кода в конце, и вам следует как можно скорее освободить ресурсы.
TYPE_WARNING сообщает вам, когда SQL Server неявно преобразует запрошенный тип курсора (FAST_FORWARD) к другому типу (обычно STATIC), если запрошенный тип несовместим с вашим оператором SELECT.