THROW (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Genera una excepción y transfiere la ejecución a un CATCH bloque de un TRY... Construcción CATCH .

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

error_number

Constante o variable que representa la excepción. El argumento error_number es int y debe ser mayor o igual que 50 000 y menor o igual que 2.147.483.647.

message

Cadena o variable que describe la excepción. El argumento message es nvarchar(2048).

state

Constante o variable entre 0 y 255 que indica el estado que se va a asociar al mensaje. El argumento state es tinyint.

Comentarios

La instrucción antes de la THROW instrucción debe ir seguida del terminador de instrucción punto y coma (;).

Si una TRY...CATCH construcción no está disponible, se finaliza el lote de instrucciones. Se establecen el número de línea y el procedimiento donde se produce la excepción. La gravedad se establece en 16.

Si la THROW instrucción se especifica sin parámetros, debe aparecer dentro de un CATCH bloque. Esto hace que se produzca la excepción detectada. Cualquier error que se produzca en una THROW instrucción hace que el lote de instrucciones finalice.

% es un carácter reservado en el texto del mensaje de una THROW instrucción y debe ser de escape. Double the % character to return % as part of the message text, for example 'The increase exceeded 15%% of the original value'.

Diferencias entre RAISERROR y THROW

En la tabla siguiente se enumeran las diferencias entre las instrucciones RAISERROR y THROW .

RAISERROR, instrucción Instrucción THROW
Si se pasa un msg_id a RAISERROR, el identificador debe definirse en sys.messages. El parámetro error_number no tiene que definirse en sys.messages.
El parámetro msg_str puede contener printf estilos de formato. El parámetro message no acepta printf el formato de estilo.
El parámetro severity especifica la gravedad de la excepción. No hay ningún parámetro de gravedad . Cuando THROW se usa para iniciar la excepción, la gravedad siempre se establece en 16. Sin embargo, cuando THROW se usa para volver a generar una excepción existente, la gravedad se establece en el nivel de gravedad de esa excepción.
No respeta la XACT_ABORT SET. Las transacciones se revierten si SET XACT_ABORT es ON.

Ejemplos

A. Uso de THROW para generar una excepción

En el siguiente ejemplo se muestra cómo utilizar la instrucción THROW para producir una excepción.

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

El conjunto de resultados es el siguiente:

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

B. Uso de THROW para generar una excepción de nuevo

En el siguiente ejemplo se muestra cómo usar la instrucción THROW para generar de nuevo la última excepción THROWN.

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;

El conjunto de resultados es el siguiente:

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. Uso de FORMATMESSAGE con THROW

En el ejemplo siguiente se muestra cómo usar la función FORMATMESSAGE con THROW para iniciar un mensaje de error personalizado. En el ejemplo se crea primero un mensaje de error definido por el usuario mediante sp_addmessage. Dado que la THROW instrucción no permite parámetros de sustitución en el parámetro de mensaje de la manera que RAISERROR hace, la FORMATMESSAGE función se usa para pasar los tres valores de parámetro esperados por el mensaje de error 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;

El conjunto de resultados es el siguiente:

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