Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base 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 o 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).