Поделиться через


THROW (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

THROW [ { error_number | @local_variable }
    , { message | @local_variable }
    , { state | @local_variable } ]
[ ; ]

Аргументы

error_number

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

message

Строка или переменная, описывающая исключение. Аргумент сообщенияnvarchar(2048).

state

Константа или переменная от 0 до 255, указывающая состояние, которое необходимо связать с сообщением. Аргумент состояния крошечный.

Замечания

Используйте состояние , чтобы определить источник ошибки в хранимой процедуре, триггере или пакете инструкций. Например, если вы используете одно и то же сообщение в нескольких местах, уникальное значение состояния поможет найти место возникновения ошибки.

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

TRY...CATCH Если конструкция недоступна, пакет инструкции завершается. Задаются номер строки и процедура, где вызывается исключение. Для серьезности задано 16значение .

THROW Если инструкция указана без параметров, она должна отображаться внутри CATCH блока. Результатом этого будет вызов возникшего исключения. Любая ошибка, возникающая в инструкции THROW , приводит к прекращению пакета инструкций.

% — зарезервированный символ в тексте THROW сообщения инструкции и должен быть экранирован. Дважды символ, % возвращаемый % как часть текста сообщения, например 'The increase exceeded 15%% of the original value'.

Различия между RAISERROR и THROW

В следующей таблице перечислены различия между операторами RAISERROR и THROW операторами.

RAISERROR, инструкция Инструкция THROW
Если передается RAISERRORmsg_id, идентификатор должен быть определен в sys.messages. Параметр error_number не должен быть определен в sys.messages.
Параметр msg_str может содержать printf стили форматирования. Параметр сообщения не принимает printf форматирование стиля.
Параметр severity указывает серьезность исключения. Нет параметра серьезности. Если THROW используется для запуска исключения, уровень серьезности всегда имеет значение 16. Однако при THROW повторном выполнении существующего исключения уровень серьезности устанавливается на уровне серьезности этого исключения.
Не учитывает set XACT_ABORT. Транзакции откатываются, если задано ONзначение SET XACT_ABORT.

Примеры

А. Использование инструкции THROW для вызова исключения

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

THROW 51000, 'The record does not exist.', 1;

Вот результирующий набор.

Msg 51000, Level 16, State 1, Line 1
The record does not exist.

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

В следующем примере показано использование инструкции THROW для повторного вызова последнего исключения.

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);

--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;

Вот результирующий набор.

In catch block.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.
The statement has been terminated.

В. Использование инструкции FORMATMESSAGE с ключевым словом THROW

В следующем примере показано, как использовать функцию FORMATMESSAGE для THROW создания настраиваемого сообщения об ошибке. В данном примере сначала создается определяемое пользователем сообщение об ошибке с помощью sp_addmessage. THROW Так как инструкция не разрешает параметры подстановки в параметре сообщения таким образомRAISERROR, функция используется для передачи трех значений параметров, FORMATMESSAGE ожидаемых сообщением 60000об ошибке.

EXEC sys.sp_addmessage
    @msgnum = 60000,
    @severity = 16,
    @msgtext = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).',
    @lang = 'us_english';
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string');

THROW 60000, @msg, 1;

Вот результирующий набор.

Msg 60000, Level 16, State 1, Line 2
This is a test message with one numeric parameter (`500`), one string parameter (First string), and another string parameter (second string).