Остановка выполнения скрипта T-SQL в MS SQL Server

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы прервать выполнение запросов в T-SQL, используйте функцию RAISERROR с уровнем серьёзности 20 и выше. Это приведёт к отключению сессии:

SQL
Скопировать код
RAISERROR('Прерывание выполнения', 20, 1) WITH LOG;

Учтите, что этот метод немедленно завершает сессию и откатывает текущую транзакцию.

Кинга Идем в IT: пошаговый план для смены профессии

Методы и приёмы завершения выполнения

Резкое прерывание с использованием RAISEERROR

Для немедленной остановки выполнения скрипта применяется RAISERROR:

SQL
Скопировать код
RAISERROR ('Остановка выполнения', 11, 1);

Скрипт останавливается, и отображается сообщение об ошибке. Уровни серьёзности от 0 до 18 доступны для всех пользователей.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Условное прерывание с помощью оператора GOTO

Оператор GOTO используется для условного прекращения выполнения:

SQL
Скопировать код
IF @YourCondition = 'Bad'
    GOTO StopExecution
-- Здесь располагается ваш код
StopExecution:

Этот способ удобен для прямого управления выполнением T-SQL.

Управление выполнением при помощи переменных

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

SQL
Скопировать код
DECLARE @ShouldRunScript BIT = 0; -- Переменная для управления выполнением

IF @ShouldRunScript = 0
    RETURN -- Пропускаем выполнение, команда, следующая за этой строкой, будет проигнорирована
-- Здесь располагается ваш код

Техники приостановки выполнения скрипта

Перевод скрипта в режим ожидания с помощью SET NOEXEC

Следующая команда позволяет "приостановить" выполнение скрипта:

SQL
Скопировать код
SET NOEXEC ON; -- Скрипт переходит в "спящий" режим
-- Ждём здесь
SET NOEXEC OFF; -- "Пробуждаем" скрипт

Скрипт проверит синтаксис, но выполнение начнется только по вашей команде.

Остановка выполнения с помощью условного оператора IF

Тактика с IF 0=1 позволяет временно приостановить выполнение кода:

SQL
Скопировать код
IF 0=1 
BEGIN 
  -- Здесь "спит" ваш скрипт
END

Это похоже на прикидывание неживого для SQL-кода.

Завершение выполнения при помощи команды RETURN

Когда необходимо тихо "уйти", используйте:

SQL
Скопировать код
RETURN
-- Весь последующий код проигнорируется

Это прямое аналогия скоропостижного "ирландского ухода" для вашего SQL-скрипта.

Визуализация

SQL-команды можно представить как дорожные знаки:

🛤️ Зелёный — для команд SELECT, INSERT, UPDATE...

🛑 Красный — для экстренной остановки: RAISERROR, THROW...

🚧 Жёлтый — для внедрения предосторожности: XACT_ABORT ON.

Применение SET XACT_ABORT ON в коде можно сравнить с эффектом экстренного торможения:

SQL
Скопировать код
SET XACT_ABORT ON;

Обработка ошибок с помощью RAISERROR: примеры

Уведомление пользователя об ошибках при помощи RAISERROR

Отправляйте предопределённые сообщения об ошибках:

SQL
Скопировать код
RAISERROR('Скрипт на паузе', 10, 1);

Подобным образом вы ясно демонстрируете статус работы скрипта.

Особенности применения RAISERROR

При использовании RAISERROR с уровнем серьёзности 20 обязательно требуются привилегии системного администратора. Дополнительные подробности о логировании ошибок смотрите в документации MSDN.

Полезные материалы

  1. RAISERROR (Transact-SQL) – SQL Server | Microsoft Learn — подробная информация о генерации ошибок.
  2. Транзакции (Transact-SQL) – SQL Server | Microsoft Learn — информация о транзакционном управлении в SQL Server.
  3. TRY...CATCH (Transact-SQL) – SQL Server | Microsoft Learn — наглядный обучающий материал по обработке ошибок.
  4. Just a moment... — форум по обсуждению вопросов, связанных с прекращением выполнения SQL-скриптов.
  5. how return string value from stored procedure – SQL Server Forums — обмен опытом по возвращению строковых значений из хранимых процедур SQL Server.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой уровень серьёзности необходимо использовать с RAISERROR для прерывания выполнения скрипта?
1 / 5