THROW (Transact-SQL)

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

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

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

Синтаксис

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

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

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.

C. Использование инструкции 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).