THROW (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Menimbulkan pengecualian dan mentransfer eksekusi ke blok CATCH dari TRY... KONSTRUKSI CATCH .

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

error_number
Adalah konstanta atau variabel yang mewakili pengecualian. error_number int dan harus lebih besar dari atau sama dengan 50000 dan kurang dari atau sama dengan 2147483647.

message
Adalah string atau variabel yang menjelaskan pengecualian. message is nvarchar(2048).

state
Adalah konstanta atau variabel antara 0 dan 255 yang menunjukkan status untuk dikaitkan dengan pesan. statusnyakecil.

Keterangan

Pernyataan sebelum pernyataan THROW harus diikuti oleh titik koma (;) pernyataan terminator.

Jika TRY... Konstruksi CATCH tidak tersedia, batch pernyataan dihentikan. Nomor baris dan prosedur tempat pengecualian dinaikkan diatur. Tingkat keparahan diatur ke 16.

Jika pernyataan THROW ditentukan tanpa parameter, pernyataan tersebut harus muncul di dalam blok CATCH. Hal ini menyebabkan pengecualian yang tertangkap dinaikkan. Kesalahan apa pun yang terjadi dalam pernyataan THROW menyebabkan batch pernyataan dihentikan.

% adalah karakter yang dipesan dalam teks pesan pernyataan THROW dan harus diloloskan. Gandakan karakter % untuk mengembalikan % sebagai bagian dari teks pesan, misalnya 'Peningkatan melebihi 15%% dari nilai asli.'

Perbedaan Antara RAISERROR dan THROW

Tabel berikut ini mencantumkan perbedaan antara pernyataan RAISERROR dan THROW.

Pernyataan RAISERROR Pernyataan THROW
Jika msg_id diteruskan ke RAISERROR, ID harus ditentukan dalam sys.messages. Parameter error_number tidak harus didefinisikan dalam sys.messages.
Parameter msg_str dapat berisi gaya pemformatan cetak. Parameter pesan tidak menerima pemformatan gaya cetak .
Parameter tingkat keparahan menentukan tingkat keparahan pengecualian. Tidak ada parameter tingkat keparahan . Ketika THROW digunakan untuk memulai pengecualian, tingkat keparahan selalu diatur ke 16. Namun, ketika THROW digunakan untuk melemparkan kembali pengecualian yang ada, tingkat keparahan diatur ke tingkat keparahan pengecualian tersebut.
Tidak menghormati SET XACT_ABORT. Transaksi akan digulung balik jika SET XACT_ABORT AKTIF.

Contoh

J. Gunakan THROW untuk memunculkan pengecualian

Contoh berikut menunjukkan cara menggunakan THROW pernyataan untuk memunculkan pengecualian.

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

Berikut adalah hasil yang ditetapkan.

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

B. Gunakan THROW untuk menaikkan pengecualian lagi

Contoh berikut menunjukkan cara menggunakan THROW pernyataan untuk memunculkan pengecualian terakhir yang dilemparkan lagi.

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;  
  

Berikut adalah hasil yang ditetapkan.

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. Menggunakan FORMATMESSAGE dengan THROW

Contoh berikut menunjukkan cara menggunakan FORMATMESSAGE fungsi dengan THROW untuk melempar pesan kesalahan yang disesuaikan. Contoh pertama-tama membuat pesan kesalahan yang ditentukan pengguna dengan menggunakan sp_addmessage. Karena pernyataan THROW tidak memungkinkan parameter substitusi dalam parameter pesan dengan cara yang dilakukan RAISERROR, fungsi FORMATMESSAGE digunakan untuk meneruskan tiga nilai parameter yang diharapkan oleh pesan kesalahan 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;  

Berikut adalah hasil yang ditetapkan.

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

Langkah berikutnya

Pelajari selengkapnya tentang konsep terkait dalam artikel berikut: