Используя курсор с динамическим SQL в хранимой процедуре

ANTS Profiler . Я не использовал много, но на самом деле у меня нет претензий к ANTS. Визуализация действительно полезна.

46
задан Leniel Maccaferri 25 September 2018 в 14:50
поделиться

2 ответа

Курсор будет принимать только оператор выбора, поэтому, если SQL действительно должен быть динамическим, сделайте объявление курсора частью выполняемого оператора. Для работы нижеприведенного сервера ваш сервер должен будет использовать глобальные курсоры.

Declare @UserID varchar(100)
declare @sqlstatement nvarchar(4000)
--move declare cursor into sql to be executed
set @sqlstatement = 'Declare  users_cursor CURSOR FOR SELECT userId FROM users'

exec sp_executesql @sqlstatement


OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN
Print @UserID
EXEC asp_DoSomethingStoredProc @UserId

FETCH NEXT FROM users_cursor --have to fetch again within loop
INTO @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor

Если вам нужно избегать использования глобальных курсоров, вы также можете вставить результаты вашего динамического SQL во временную таблицу, а затем использовать эту таблицу для заполнения ваш курсор.

Declare @UserID varchar(100)
create table #users (UserID varchar(100))

declare @sqlstatement nvarchar(4000)
set @sqlstatement = 'Insert into #users (userID) SELECT userId FROM users'
exec(@sqlstatement)

declare users_cursor cursor for Select UserId from #Users
OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN

EXEC asp_DoSomethingStoredProc @UserId

FETCH NEXT FROM users_cursor
INTO @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor

drop table #users
110
ответ дан 26 November 2019 в 20:07
поделиться

Во-первых, по возможности избегайте использования курсора. Вот некоторые ресурсы для его искоренения, когда кажется, что без курсора не обойтись:

Должно быть 15 способов потерять курсоры ... часть 1, Введение

Построчная обработка без курсора

] Тем не менее, вы можете застрять с одним в конце концов - я не знаю достаточно из вашего вопроса, чтобы быть уверенным, что любой из них применим. В этом случае у вас другая проблема - оператор select для вашего курсора должен быть фактическим оператором SELECT, а не оператором EXECUTE. Вы застряли.

Но посмотрите ответ от cmsjr (который пришел, когда я писал) об использовании временной таблицы. Я бы избегал глобальных курсоров даже больше, чем «простых» ....

3
ответ дан 26 November 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: