THROW (Transact-SQL)

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacenamiento de datos paralelos

Genera una excepción y transfiere la ejecución a un bloque CATCH de una construcción TRY…CATCH en SQL Server.

Icono de vínculo de tema 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 y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

error_number
Es una constante o una variable que representan la excepción. error_number es de tipo int y debe ser mayor o igual que 50000 y menor o igual que 2147483647.

message
Es una cadena o una variable que describe la excepción. message es nvarchar (2048) .

state
Es una constante o una variable comprendida entre 0 y 255 que indica el estado que se ha de asociar al mensaje. state es tinyint.

Observaciones

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

Si una construcción TRY…CATCH no está disponible, el lote de instrucciones se finaliza. 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 instrucción THROW se especifica sin parámetros, debe aparecer dentro de un bloque CATCH. Esto hace que se produzca la excepción detectada. Cualquier error que se produzca en una instrucción THROW hace que el lote de instrucciones se finalice.

% es un carácter reservado en el texto del mensaje de una instrucción THROW y debe ser de escape. Duplique el carácter % para devolver % como parte del texto del mensaje, por ejemplo "el aumento supera un 15 %% el valor original".

Diferencias entre RAISERROR y THROW

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

RAISERROR, instrucción Instrucción THROW
Si se pasa msg_id a RAISERROR, el identificador se debe definir en sys.messages. El parámetro error_number no tiene que definirse en sys.messages.
El parámetro msg_str puede contener estilos de formato de printf. El parámetro message no acepta el formato de estilo de printf.
El parámetro severity especifica la gravedad de la excepción. No hay ningún parámetro severity. Cuando THROW se usa para iniciar la excepción, la gravedad siempre se establece en 16, pero cuando se usa para volver a producir una excepción existente, la gravedad se establecerá en el nivel de gravedad de la excepción en cuestión.

Ejemplos

A. Usar 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. Usar THROW para generar de nuevo una excepción

El siguiente ejemplo muestra cómo utilizar 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. Usar FORMATMESSAGE con THROW

En el ejemplo siguiente se muestra cómo usar la función FORMATMESSAGE con THROW para producir un mensaje de error personalizado. En el ejemplo se crea primero un mensaje de error definido por el usuario mediante sp_addmessage. Como la instrucción THROW no permite parámetros de sustitución en el parámetro message de la manera en que lo hace RAISERROR, la función FORMATMESSAGE se emplea 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).

Consulte también

FORMATMESSAGE (Transact-SQL)
Niveles de gravedad de error del motor de base de datos
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
RAISERROR (Transact-SQL)
@@ERROR (Transact-SQL)
GOTO (Transact-SQL)
BEGIN...END (Transact-SQL)
XACT_STATE (Transact-SQL)
SET XACT_ABORT (Transact-SQL)