THROW (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento 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 } ]
[ ; ]
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
Use el estado para ayudarle a identificar el origen de un error en el procedimiento almacenado, desencadenador o lote de instrucciones. Por ejemplo, si usa el mismo mensaje en varios lugares, un valor de estado único puede ayudarle a localizar dónde se produjo el error.
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;
Este es el conjunto de resultados.
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;
Este es el 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. 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 60000
de error .
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;
Este es el 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).