Остановка выполнения скрипта T-SQL в MS SQL Server
Быстрый ответ
Чтобы прервать выполнение запросов в T-SQL, используйте функцию RAISERROR
с уровнем серьёзности 20 и выше. Это приведёт к отключению сессии:
RAISERROR('Прерывание выполнения', 20, 1) WITH LOG;
Учтите, что этот метод немедленно завершает сессию и откатывает текущую транзакцию.
Методы и приёмы завершения выполнения
Резкое прерывание с использованием RAISEERROR
Для немедленной остановки выполнения скрипта применяется RAISERROR
:
RAISERROR ('Остановка выполнения', 11, 1);
Скрипт останавливается, и отображается сообщение об ошибке. Уровни серьёзности от 0 до 18 доступны для всех пользователей.
Условное прерывание с помощью оператора GOTO
Оператор GOTO
используется для условного прекращения выполнения:
IF @YourCondition = 'Bad'
GOTO StopExecution
-- Здесь располагается ваш код
StopExecution:
Этот способ удобен для прямого управления выполнением T-SQL.
Управление выполнением при помощи переменных
Чтобы иметь полный контроль над выполнением, можно использовать управляющие переменные:
DECLARE @ShouldRunScript BIT = 0; -- Переменная для управления выполнением
IF @ShouldRunScript = 0
RETURN -- Пропускаем выполнение, команда, следующая за этой строкой, будет проигнорирована
-- Здесь располагается ваш код
Техники приостановки выполнения скрипта
Перевод скрипта в режим ожидания с помощью SET NOEXEC
Следующая команда позволяет "приостановить" выполнение скрипта:
SET NOEXEC ON; -- Скрипт переходит в "спящий" режим
-- Ждём здесь
SET NOEXEC OFF; -- "Пробуждаем" скрипт
Скрипт проверит синтаксис, но выполнение начнется только по вашей команде.
Остановка выполнения с помощью условного оператора IF
Тактика с IF 0=1
позволяет временно приостановить выполнение кода:
IF 0=1
BEGIN
-- Здесь "спит" ваш скрипт
END
Это похоже на прикидывание неживого для SQL-кода.
Завершение выполнения при помощи команды RETURN
Когда необходимо тихо "уйти", используйте:
RETURN
-- Весь последующий код проигнорируется
Это прямое аналогия скоропостижного "ирландского ухода" для вашего SQL-скрипта.
Визуализация
SQL-команды можно представить как дорожные знаки:
🛤️ Зелёный — для команд SELECT
, INSERT
, UPDATE
...
🛑 Красный — для экстренной остановки: RAISERROR
, THROW
...
🚧 Жёлтый — для внедрения предосторожности: XACT_ABORT ON
.
Применение SET XACT_ABORT ON
в коде можно сравнить с эффектом экстренного торможения:
SET XACT_ABORT ON;
Обработка ошибок с помощью RAISERROR: примеры
Уведомление пользователя об ошибках при помощи RAISERROR
Отправляйте предопределённые сообщения об ошибках:
RAISERROR('Скрипт на паузе', 10, 1);
Подобным образом вы ясно демонстрируете статус работы скрипта.
Особенности применения RAISERROR
При использовании RAISERROR
с уровнем серьёзности 20 обязательно требуются привилегии системного администратора. Дополнительные подробности о логировании ошибок смотрите в документации MSDN.
Полезные материалы
- RAISERROR (Transact-SQL) – SQL Server | Microsoft Learn — подробная информация о генерации ошибок.
- Транзакции (Transact-SQL) – SQL Server | Microsoft Learn — информация о транзакционном управлении в SQL Server.
- TRY...CATCH (Transact-SQL) – SQL Server | Microsoft Learn — наглядный обучающий материал по обработке ошибок.
- Just a moment... — форум по обсуждению вопросов, связанных с прекращением выполнения SQL-скриптов.
- how return string value from stored procedure – SQL Server Forums — обмен опытом по возвращению строковых значений из хранимых процедур SQL Server.