SQL-сервер THROW

В этом руководстве вы узнаете, как использовать оператор SQL Server THROW для создания исключения.

Обзор оператора THROW SQL Server

Оператор THROW вызывает исключение и передает выполнение блоку CATCH конструкции TRY CATCH.

Ниже показан синтаксис оператора THROW:

THROW [ error_number ,  
        message ,  
        state ];

В этом синтаксисе:

номер_ошибки

error_number — это целое число, представляющее исключение. error_number должен быть больше 50 000 и меньше или равен 2 147 483 647.

сообщение

Сообщение представляет собой строку типа NVARCHAR(2048), описывающую исключение.

состояние

Состояние — это TINYINT со значением от 0 до 255. Состояние указывает состояние, связанное с сообщением.

Если вы не указали ни одного параметра для оператора THROW, вы должны поместить оператор THROW внутрь блока CATCH:

BEGIN TRY
    -- statements that may cause errors
END TRY
BEGIN CATCH
    -- statement to handle errors 
    THROW;   
END CATCH

В этом случае оператор THROW вызывает ошибку, которая была перехвачена блоком CATCH.

Обратите внимание, что оператор перед оператором THROW должен заканчиваться точкой с запятой(;)

THROW против RAISERROR

В следующей таблице показана разница между операторами THROW и RAISERROR :

RAISERROR БРОСАТЬ
message_id, который вы передаете в RAISERROR, должен быть определен в представлении sys.messages. Параметр error_number не обязательно должен быть определен в представлении sys.messages.
Параметр сообщения может содержать стили форматирования printf, такие как %s и %d. Параметр сообщения не принимает форматирование в стиле printf. Используйте функцию FORMATMESSAGE() для подстановки параметров.
Параметр серьезности указывает серьезность исключения. Серьезность исключения всегда устанавливается на уровне 16.

Примеры операторов SQL Server THROW

Давайте рассмотрим несколько примеров использования оператора THROW, чтобы лучше понять его.

A) Использование оператора THROW для вызова исключения

В следующем примере оператор THROW используется для создания исключения:

THROW 50005, N'An error occurred', 1;

Вот что получилось:

Msg 50005, Level 16, State 1, Line 1
An error occurred

B) Использование оператора THROW для повторной генерации исключения

Сначала создадим новую таблицу t1 для демонстрации:

CREATE TABLE t1(
    id int primary key
);
GO

Затем используйте оператор THROW без аргументов в блоке CATCH, чтобы повторно выдать перехваченную ошибку:

BEGIN TRY
    INSERT INTO t1(id) VALUES(1);
    --  cause error
    INSERT INTO t1(id) VALUES(1);
END TRY
BEGIN CATCH
    PRINT('Raise the caught error again');
    THROW;
END CATCH

Вот что получилось:

(1 row affected)
(0 rows affected)
Raise the caught error again
Msg 2627, Level 14, State 1, Line 10
Violation of PRIMARY KEY constraint 'PK__t1__3213E83F906A55AA'. Cannot insert duplicate key in object 'dbo.t1'. The duplicate key value is(1).

В этом примере первый оператор INSERT был выполнен успешно. Однако второй не удался из-за ограничения первичного ключа. Поэтому ошибка была перехвачена блоком CATCH и снова вызвана оператором THROW.

C) Использование оператора THROW для повторной генерации исключения

В отличие от оператора RAISERROR, оператор THROW не позволяет вам подставлять параметры в текст сообщения. Поэтому для имитации этой функции вы используете функцию FORMATMESSAGE().

Следующий оператор добавляет пользовательское сообщение в представление каталога sys.messages:

EXEC sys.sp_addmessage 
    @msgnum = 50010, 
    @severity = 16, 
    @msgtext =
    N'The order number %s cannot be deleted because it does not exist.', 
    @lang = 'us_english';   
GO

В этом операторе используется message_id 50010 и заменяется заполнитель %s на идентификатор заказа «1001»:

DECLARE @MessageText NVARCHAR(2048);
SET @MessageText =  FORMATMESSAGE(50010, N'1001');   
THROW 50010, @MessageText, 1; 

Вот что получилось:

Msg 50010, Level 16, State 1, Line 8
The order number 1001 cannot be deleted because it does not exist.

В этом руководстве вы узнали, как использовать оператор SQL Server THROW для создания исключения.

Мирослав С.

Автор статей, ИБ-специалист