Как я могу убедиться, что я освободил курсор, если он уже существует, прежде чем я попытаюсь открыть это снова?
Для таблицы я могу использовать что-то вроде:
if exists (select top 1 from tempdb.sys.tables where name = '##tmpTable')
drop table ##tmpTable;
... then I can recreate my ##tmpTable
Но я не могу понять, как это сделать для курсора, такого как
-- First clean up if already exists..
..... <----- what goes here???
-- Declare and use a cursor
DECLARE someCursorName CURSOR
FOR
select something from somewhere
FOR READ ONLY
Я делаю это, чтобы убедиться, что мой скрипт очистится перед ним начинает работу
Лучшее, что я могу придумать, это:
begin try DEALLOCATE someCursorName ; end try begin catch end catch
Это хорошая практика?
РЕДАКТИРОВАТЬ: Это сценарий обслуживания. В наших базах данных, в значительной степени настраиваемых клиентами, может быть много таблиц, и курсор используется для выполнения статистического анализа по таблицам - в зависимости от типов таблиц происходят разные вещи. В основном много динамических sql. Если сценарий не работает, я хотел бы иметь возможность повторить задание, не беспокоясь о ручном вмешательстве. Здесь есть только один уровень охвата.
Как и все, я рад заменить курсоры операциями над наборами.Циклы курсоров выполняют следующие действия: