THROW (Transact-SQL)

Si applica a: sìSQL Server (tutte le versioni supportate) Sìdatabase SQL di Azure SìIstanza gestita di SQL di Azure sìAzure Synapse Analytics sìParallel Data Warehouse

Genera un'eccezione e trasferisce l'esecuzione a un blocco CATCH di un costrutto TRY...CATCH in SQL Server.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

error_number
Costante o variabile che rappresenta l'eccezione. error_number è di tipo int e deve essere maggiore o uguale a 50000 e minore o uguale a 2147483647.

message
Stringa o variabile in cui viene descritta l'eccezione. message è di tipo nvarchar(2048) .

state
Costante o variabile compresa tra 0 e 255 tramite cui viene indicato lo stato da associare al messaggio. state è di tipo tinyint.

Osservazioni

L'istruzione che precede l'istruzione THROW deve essere seguita dal carattere di terminazione punto e virgola (;).

Se non è disponibile un costrutto TRY...CATCH, il batch di istruzioni viene terminato. Vengono impostate la procedura e numero di riga in cui viene generata l'eccezione. La gravità viene impostata su 16.

Se l'istruzione THROW viene specificata senza parametri, è necessario che venga visualizzata in un blocco CATCH. In questo modo verrà generata l'eccezione rilevata. Tutti gli errori che si verificano in un'istruzione THROW causano la terminazione del batch di istruzioni.

% è un carattere riservato nel testo del messaggio di un'istruzione THROW e deve essere preceduto da un carattere di escape. Raddoppiare il carattere % per restituire % come parte del testo del messaggio, ad esempio "L'aumento ha superato il 15% del valore originale".

Differenze tra RAISERROR e THROW

Nella tabella seguente vengono elencate le differenze tra le istruzioni RAISERROR e THROW.

istruzione RAISERROR Istruzione THROW
Se msg_id viene passato a RAISERROR, l'ID deve essere definito in sys.messages. Il parametro error_number non deve essere definito in sys.messages.
Il parametro msg_str può contenere stili di formattazione printf. Il parametro message non accetta stili di formattazione printf.
Il parametro severity specifica la gravità dell'eccezione. Non esiste un parametro severity. Quando si usa THROW per generare l'eccezione, la gravità viene sempre impostata su 16. Tuttavia, quando si usa THROW per generare nuovamente un'eccezione esistente, la gravità viene impostata sul livello di gravità di tale eccezione.

Esempi

R. Utilizzo di THROW per generare un'eccezione

Nell'esempio seguente viene illustrato come utilizzare l'istruzione THROW per generare un'eccezione.

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

Questo è il set di risultati.

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

B. Utilizzo di THROW per generare nuovamente un'eccezione

Nell'esempio seguente viene illustrato come utilizzare l'istruzione THROW per generare nuovamente l'ultima eccezione generata.

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;  
  

Questo è il set di risultati.

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. Utilizzo di FORMATMESSAGE con THROW

Nell'esempio seguente viene illustrato come utilizzare la funzione FORMATMESSAGE con THROW per generare un messaggio di errore personalizzato. Nell'esempio viene prima creato un messaggio di errore definito dall'utente tramite sp_addmessage. Poiché l'istruzione THROW non consente parametri di sostituzione nel parametro message come invece avviene con RAISERROR, la funzione FORMATMESSAGE viene utilizzata per passare i tre valori dei parametri previsti nel messaggio di errore 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;  

Questo è il set di risultati.

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

Vedere anche

FORMATMESSAGE (Transact-SQL)
Gravità degli errori del motore di database
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)