Как я могу убедиться, что освободил курсор, если он уже существует, прежде чем пытаться открыть его снова?
Для таблицы я могу использовать что-то вроде:
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
Это хорошая практика?
EDIT:
Это сценарий обслуживания. В наших специализированных клиентских базах данных может быть много таблиц, и курсор используется для статистического анализа таблиц - в зависимости от типов таблиц могут происходить разные вещи. В основном много динамического sql. Если скрипт не удастся, я бы хотел повторить работу, не беспокоясь о ручном вмешательстве. Здесь есть только один уровень охвата.
Как и все, я рад заменить курсоры операциями над множествами. Вот что делают циклы курсора:
- создание sql для реорганизации / перестроения индексов (изначально был ручной sql для определения DDL для запуска, а затем был выдан DDL)
- анализировать разброс данных и ошибки в разных таблицах
- поиск ошибок в журналах, поиск соответствующих таблиц и получение этих данных (изначально был ручной sql, чтобы определить места, где были ошибки, а затем вырезать и вставлять шаблон (ы) для поиска ошибок, зависящих от типов ошибка)