THROW (Transact-SQL)THROW (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Genera una excepción y transfiere la ejecución a un bloque CATCH de una construcción TRY…CATCH en SQL ServerSQL Server.Raises an exception and transfers execution to a CATCH block of a TRY...CATCH construct in SQL ServerSQL Server.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

error_numbererror_number
Es una constante o una variable que representan la excepción.Is a constant or variable that represents the exception. error_number es de tipo int y debe ser mayor o igual que 50000 y menor o igual que 2147483647.error_number is int and must be greater than or equal to 50000 and less than or equal to 2147483647.

messagemessage
Es una cadena o una variable que describe la excepción.Is an string or variable that describes the exception. message es nvarchar (2048) .message is nvarchar(2048).

statestate
Es una constante o una variable comprendida entre 0 y 255 que indica el estado que se ha de asociar al mensaje.Is a constant or variable between 0 and 255 that indicates the state to associate with the message. state es tinyint.state is tinyint.

NotasRemarks

La instrucción anterior a la instrucción THROW debe ir seguida del terminador de instrucción punto y coma (;).The statement before the THROW statement must be followed by the semicolon (;) statement terminator.

Si una construcción TRY…CATCH no está disponible, el lote de instrucciones se finaliza.If a TRY...CATCH construct is not available, the statement batch is terminated. Se establecen el número de línea y el procedimiento donde se produce la excepción.The line number and procedure where the exception is raised are set. La gravedad se establece en 16.The severity is set to 16.

Si la instrucción THROW se especifica sin parámetros, debe aparecer dentro de un bloque CATCH.If the THROW statement is specified without parameters, it must appear inside a CATCH block. Esto hace que se produzca la excepción detectada.This causes the caught exception to be raised. Cualquier error que se produzca en una instrucción THROW hace que el lote de instrucciones se finalice.Any error that occurs in a THROW statement causes the statement batch to be terminated.

% es un carácter reservado en el texto del mensaje de una instrucción THROW y debe ser de escape.% is a reserved character in the message text of a THROW statement and must be escaped. Duplique el carácter % para devolver % como parte del texto del mensaje, por ejemplo "el aumento supera un 15 %% el valor original".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 THROWDifferences Between RAISERROR and THROW

En la siguiente tabla se enumeran algunas diferencias entre las instrucciones THROW y RAISERROR.The following table lists differences between the RAISERROR and THROW statements.

RAISERROR, instrucciónRAISERROR statement Instrucción THROWTHROW statement
Si se pasa msg_id a RAISERROR, el identificador se debe definir en sys.messages.If a msg_id is passed to RAISERROR, the ID must be defined in sys.messages. El parámetro error_number no tiene que definirse en sys.messages.The error_number parameter does not have to be defined in sys.messages.
El parámetro msg_str puede contener estilos de formato de printf.The msg_str parameter can contain printf formatting styles. El parámetro message no acepta el formato de estilo de printf.The message parameter does not accept printf style formatting.
El parámetro severity especifica la gravedad de la excepción.The severity parameter specifies the severity of the exception. No hay ningún parámetro severity.There is no severity parameter. La gravedad de la excepción siempre está establecida en 16.The exception severity is always set to 16.

EjemplosExamples

A.A. Usar THROW para generar una excepciónUsing THROW to raise an exception

En el siguiente ejemplo se muestra cómo utilizar la instrucción THROW para producir una excepción.The following example shows how to use the THROW statement to raise an exception.

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

El conjunto de resultados es el siguiente.Here is the result set.

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

B.B. Usar THROW para generar de nuevo una excepciónUsing THROW to raise an exception again

El siguiente ejemplo muestra cómo utilizar la instrucción THROW para generar de nuevo la última excepción THROWN.The following example shows how use the THROW statement to raise the last thrown exception again.

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.Here is the result set.

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.C. Usar FORMATMESSAGE con THROWUsing FORMATMESSAGE with THROW

En el ejemplo siguiente se muestra cómo usar la función FORMATMESSAGE con THROW para producir un mensaje de error personalizado.The following example shows how to use the FORMATMESSAGE function with THROW to throw a customized error message. En el ejemplo se crea primero un mensaje de error definido por el usuario mediante sp_addmessage.The example first creates a user-defined error message by using 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.Because the THROW statement does not allow for substitution parameters in the message parameter in the way that RAISERROR does, the FORMATMESSAGE function is used to pass the three parameter values expected by error message 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.Here is the result set.

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énSee Also

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