Курсор TSQL, как проверить, объявлен ли он уже, и, таким образом, освободить

Как я могу убедиться, что я освободил курсор, если он уже существует, прежде чем я попытаюсь открыть это снова?

Для таблицы я могу использовать что-то вроде:

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. Если сценарий не работает, я хотел бы иметь возможность повторить задание, не беспокоясь о ручном вмешательстве. Здесь есть только один уровень охвата.

Как и все, я рад заменить курсоры операциями над наборами.Циклы курсоров выполняют следующие действия:

  • конструируют sql для реорганизации / перестройки индексов (изначально был ручной sql для определения выполняемого DDL, а затем был выпущен DDL)
  • анализировать разброс данных и ошибки в разных таблицах
  • находят ошибки в журналах, просматривают соответствующие таблицы и получают эти данные (изначально был ручной sql для определения мест, где ошибки, а затем вырезать и вставлять шаблон (ы) для поиска ошибок зависит от типа ошибки)
7
задан Solomon Rutzky 19 September 2019 в 06:31
поделиться