Bagikan melalui


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 CATCH blok 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

Konstanta atau variabel yang mewakili pengecualian. Argumen error_number int, dan harus lebih besar dari atau sama dengan 50.000, dan kurang dari atau sama dengan 2.147.483.647.

message

String atau variabel yang menjelaskan pengecualian. Argumen pesan adalah nvarchar(2048).

state

Konstanta atau variabel antara 0 dan 255 yang menunjukkan status untuk dikaitkan dengan pesan. Argumen status kecil.

Keterangan

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

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

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

% adalah karakter yang dipesan THROW dalam teks pesan pernyataan dan harus diloloskan. Gandakan % karakter untuk dikembalikan % sebagai bagian dari teks pesan, misalnya 'The increase exceeded 15%% of the original value'.

Perbedaan antara RAISERROR dan THROW

Tabel berikut ini mencantumkan perbedaan antara RAISERROR dan THROW pernyataan.

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 printf gaya pemformatan. Parameter pesan tidak menerima printf pemformatan gaya.
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 menumbuhkan kembali pengecualian yang ada, tingkat keparahan diatur ke tingkat keparahan pengecualian tersebut.
Tidak menghormati SET XACT_ABORT. Transaksi digulung balik jika SET XACT_ABORT adalah ON.

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