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 .
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:
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk