Во-первых, наличие хранимого процесса, который может быть вызван только одним клиентом в любое время, может быть плохой вещью - предполагает, что ваше управление транзакциями может быть подозрительным.
Однако для этого есть законные причины - например, если хранимый процесс потребляет много системных ресурсов.
Я сделал это, создав таблицу «пакетов» примерно следующим образом:
batchid start_date end_date current_status
Когда начинается процесс, он вставляет в эту таблицу запись с конечной датой NULL и"Запущено" current_status;когда он завершается, он обновляет эту запись с end_date и «done» current_status.
Затем вы можете вставить проверку в начале процедуры и сразу же вернуть ее, если найдет запись в таблице «пакетов» с current_status «запущено».
Вы должны убедиться, что все точки выхода из процесса обновляют поле current_status - иначе ваш процесс никогда не запустится после того, как ошибка вызовет прерывание процесса.
Уродливо, но эффективно.