LANÇAR (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Levanta uma exceção e transfere a execução para um CATCH bloco de um TRY... Construção CATCH .

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

error_number

Uma constante ou variável que representa a exceção. O argumento error_number é int, e deve ser maior ou igual a 50.000, e menor ou igual a 2.147.483.647.

message

Uma cadeia de caracteres ou variável que descreve a exceção. O argumento da mensagem é nvarchar(2048).

state

Uma constante ou variável entre 0 e 255 que indica o estado a ser associado à mensagem. O argumento do Estado é minúsculo.

Remarks

Use o estado para ajudá-lo a identificar a origem de um erro no procedimento armazenado, gatilho ou lote de instruções. Por exemplo, se você usar a mesma mensagem em vários locais, um valor de estado exclusivo pode ajudá-lo a localizar onde o erro ocorreu.

A instrução antes da THROW instrução deve ser seguida pelo terminador da instrução ponto-e-vírgula (;).

Se uma TRY...CATCH construção não estiver disponível, o lote de instrução será encerrado. O número da linha e o procedimento em que a exceção é levantada são definidos. A gravidade é definida como 16.

Se a THROW instrução for especificada sem parâmetros, ela deve aparecer dentro de um CATCH bloco . Isso faz com que a exceção capturada seja levantada. Qualquer erro que ocorra em uma THROW instrução faz com que o lote de instruções seja encerrado.

% é um caractere reservado no texto da mensagem de uma THROW instrução e deve ser escapado. Duplique o % caractere a ser retornado % como parte do texto da mensagem, por exemplo 'The increase exceeded 15%% of the original value'.

Diferenças entre RAISERROR e THROW

A tabela a seguir lista as diferenças entre o RAISERROR e THROW as instruções.

Instrução RAISERROR Instrução THROW
Se um msg_id for passado para RAISERROR, o ID deverá ser definido em sys.messages. O parâmetro error_number não precisa ser definido em sys.messages.
O parâmetro msg_str pode conter printf estilos de formatação. O parâmetro message não aceita printf formatação de estilo.
O parâmetro severity especifica a gravidade da exceção. Não há parâmetro de gravidade . Quando THROW é usado para iniciar a exceção, a gravidade é sempre definida como 16. No entanto, quando THROW é usado para relançar uma exceção existente, a gravidade é definida para o nível de gravidade dessa exceção.
Não honra SET XACT_ABORT. As transações são revertidas se SET XACT_ABORT for ON.

Examples

A. Use THROW para gerar uma exceção

O exemplo a seguir mostra como usar a THROW instrução para gerar uma exceção.

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

Aqui está o conjunto de resultados.

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

B. Use THROW para gerar uma exceção novamente

O exemplo a seguir mostra como usar a THROW instrução para gerar a última exceção lançada novamente.

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;

Aqui está o conjunto de resultados.

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. Use FORMATMESSAGE com THROW

O exemplo a seguir mostra como usar a função FORMATMESSAGE com THROW para lançar uma mensagem de erro personalizada. O exemplo primeiro cria uma mensagem de erro definida pelo usuário usando sp_addmessage. Como a THROW instrução não permite parâmetros de substituição no parâmetro message da maneira que RAISERROR faz, a FORMATMESSAGE função é usada para passar os três valores de parâmetro esperados pela mensagem 60000de erro .

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;

Aqui está o conjunto de resultados.

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).