THROW (Transact-SQL)
Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft Fabric
Genera un'eccezione e trasferisce l'esecuzione a un CATCH
blocco di try ... Costrutto CATCH .
Convenzioni relative alla 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 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.
Argomenti
error_number
Costante o variabile che rappresenta l'eccezione. L'argomento error_number è int e deve essere maggiore o uguale a 50.000 e minore o uguale a 2.147.483.647.
message
Stringa o variabile che descrive l'eccezione. L'argomento del messaggio è nvarchar(2048).
state
Costante o variabile compresa tra 0 e 255 che indica lo stato da associare al messaggio. L'argomento state è tinyint.
Osservazioni:
L'istruzione prima dell'istruzione deve essere seguita dal carattere di terminazione dell'istruzione THROW
() punto e virgola (;
).
Se un TRY...CATCH
costrutto non è disponibile, il batch di istruzioni viene terminato. Vengono impostate la procedura e numero di riga in cui viene generata l'eccezione. La gravità è impostata su 16
.
Se l'istruzione THROW
viene specificata senza parametri, deve essere visualizzata all'interno di un CATCH
blocco. In questo modo verrà generata l'eccezione rilevata. Qualsiasi errore che si verifica in un'istruzione THROW
fa sì che il batch di istruzioni venga terminato.
%
è un carattere riservato nel testo del messaggio di un'istruzione THROW
e deve essere preceduto da un carattere di escape. Raddoppiare il %
carattere da restituire %
come parte del testo del messaggio, ad esempio 'The increase exceeded 15%% of the original value'
.
Differenze tra RAI edizione Standard RROR e THROW
Nella tabella seguente sono elencate le differenze tra le istruzioni RAI edizione Standard RROR e THROW
.
istruzione RAISERROR | Istruzione THROW |
---|---|
Se un 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 printf stili di formattazione. |
Il parametro del messaggio non accetta printf la formattazione dello stile. |
Il parametro severity specifica la gravità dell'eccezione. | Non esiste alcun parametro di gravità . Quando THROW viene usato per avviare l'eccezione, la gravità viene sempre impostata su 16 . Tuttavia, quando THROW viene usato per rigenerare un'eccezione esistente, la gravità viene impostata sul livello di gravità dell'eccezione. |
Non rispetta edizione Standard T XACT_ABORT. | Viene eseguito il rollback delle transazioni se edizione Standard T XACT_ABORT è ON . |
Esempi
R. Usare 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. Usare 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. Usare FORMATMESSAGE con THROW
Nell'esempio seguente viene illustrato come usare 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 nel modo che RAISERROR
esegue questa operazione, la FORMATMESSAGE
funzione viene usata per passare i tre valori di parametro previsti dal 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).
Contenuto correlato
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per