Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL 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
Syntax
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
Arguments
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.
Remarks
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. Duplica el % carácter para devolver % como parte del texto del mensaje, por 'The increase exceeded 15%% of the original value'ejemplo .
Diferencias entre RAISERROR y THROW
En la tabla siguiente se enumeran las diferencias entre las instrucciones RAISERROR y THROW .
| Sentencia RAISERROR | 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. |
Examples
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 60000de 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).