Udostępnij za pomocą


RZUĆ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Zgłasza wyjątek i przesyła wykonywanie do CATCH bloku try... Konstrukcja CATCH .

Transact-SQL konwencje składni

Syntax

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

Arguments

error_number

Stała lub zmienna reprezentująca wyjątek. Argument error_number jest int i musi być większy lub równy 50 000, a mniejszy lub równy 2147 483 647.

message

Ciąg lub zmienna, która opisuje wyjątek. Argumentem komunikatu jest nvarchar(2048).

state

Stała lub zmienna z zakresu od 0 do 255, która wskazuje stan, który ma być skojarzony z komunikatem. Argument stanu jest tinyint.

Remarks

Użyj stanu , aby ułatwić zidentyfikowanie źródła błędu w partii procedury składowanej, wyzwalacza lub instrukcji. Jeśli na przykład używasz tego samego komunikatu w wielu miejscach, unikatowa wartość stanu może pomóc w zlokalizowaniu miejsca wystąpienia błędu.

Instrukcja przed instrukcją THROW musi być zgodna z średnikiem (;) terminatorem instrukcji.

TRY...CATCH Jeśli konstrukcja nie jest dostępna, partia instrukcji zostanie zakończona. Numer wiersza i procedura, w której jest zgłaszany wyjątek, są ustawione. Ważność jest ustawiona na 16.

Jeśli instrukcja jest określona THROW bez parametrów, musi być wyświetlana CATCH wewnątrz bloku. Powoduje to zgłaszanie przechwyconego wyjątku. Wszelkie błędy występujące w THROW instrukcji powodują zakończenie partii instrukcji.

% jest zastrzeżonym znakiem w tekście komunikatu instrukcji THROW i musi zostać unikniętą. Podwaja znak % , aby powrócić % jako część tekstu wiadomości, na przykład 'The increase exceeded 15%% of the original value'.

Różnice między RAISERROR i THROW

W poniższej tabeli wymieniono różnice między instrukcjami RAISERROR i THROW .

Instrukcja RAISERROR Instrukcja THROW
Jeśli msg_id jest przekazywany do RAISERRORelementu , identyfikator musi być zdefiniowany w pliku sys.messages. Parametr error_number nie musi być zdefiniowany w pliku sys.messages.
Parametr msg_str może zawierać printf style formatowania. Parametr komunikatu nie akceptuje printf formatowania stylu.
Parametr ważności określa ważność wyjątku. Nie ma parametru ważności . Gdy THROW jest używany do inicjowania wyjątku, ważność jest zawsze ustawiona na 16wartość . Jednak gdy THROW jest używany do ponownego wymuśnia istniejącego wyjątku, ważność jest ustawiona na poziom ważności tego wyjątku.
Nie honoruje XACT_ABORT SET. Transakcje są wycofywane , jeśli zestaw XACT_ABORT to ON.

Examples

A. Używanie funkcji THROW w celu zgłoszenia wyjątku

W poniższym przykładzie pokazano, jak za pomocą instrukcji THROW zgłosić wyjątek.

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

Oto zestaw wyników.

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

B. Użyj funkcji THROW, aby ponownie zgłosić wyjątek

W poniższym przykładzie pokazano, jak użyć instrukcji , THROW aby ponownie zgłosić ostatni zgłoszony wyjątek.

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;

Oto zestaw wyników.

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. Używanie funkcji FORMATMESSAGE z funkcją THROW

W poniższym przykładzie pokazano, jak za pomocą funkcji THROW zgłosić dostosowany komunikat o błędzie. W przykładzie najpierw zostanie utworzony komunikat o błędzie zdefiniowany przez użytkownika przy użyciu polecenia sp_addmessage. THROW Ponieważ instrukcja nie zezwala na parametry podstawienia w parametrze komunikatu w taki sposób, RAISERRORFORMATMESSAGE że funkcja jest używana do przekazywania trzech wartości parametrów oczekiwanych przez komunikat 60000o błędzie .

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;

Oto zestaw wyników.

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