Using RAISERROR

RAISERROR jest używane do zwracania wiadomości z powrotem do aplikacji za pomocą tego samego formatu jak błąd systemowy lub ostrzeżenie wiadomości generowane przez SQL Server Database Engine.

RAISERROR może zwracać jeden:

  • Komunikat o błędzie przez użytkownika, który został utworzony przy użyciu systemu sp_addmessage procedura przechowywana.Są to komunikaty z liczbą wiadomości większych niż 50 000, które mogą być wyświetlane w widoku sys.messages wykazu.

  • Ciąg komunikatu, określona w instrukcja RAISERROR.

RAISERROR może również:

  • Przypisać numer błędu, wskaźnik ważności i stanu.

  • Wniosek, że błąd jest rejestrowany w Dzienniku Database Engine Dziennik błędów oraz Microsoft W dzienniku aplikacji systemu Windows.

  • Podstawianie wartości argumentu do tekstu wiadomości, podobnie jak języka C printf_s Funkcja.

Zarówno RAISERROR i PRINT może służyć do zwracania komunikaty ostrzegawcze lub informacyjne do aplikacji.Tekst komunikatu, zwracane przez RAISERROR może być budowany za pomocą funkcja podstawiania ciąg podobne do funkcja printf_s C biblioteki standardowej, PRINT tylko może zwracać ciąg znaków lub znaku wyrażenie.RAISERROR ważności 11-19 wykonywane w blok TRY konstrukcji TRY…CATCH powoduje, że formant do skojarzonego blok CATCH.Określ ważności lub niższy od 10 do zwracania wiadomości za pomocą instrukcji RAISERROR bez wywoływania blok CATCH.PRINT nie przeniesienie formantu blok CATCH.

Gdy RAISERROR jest używany z msg_id wiadomości przez użytkownika w sys.messages, msg_id zwracane w postaci SQL Server numer błędu lub kod błędu macierzystym. Gdy RAISERROR jest używany z msg_str zamiast msg_id, SQL Server Błąd macierzysty i numer błędu Liczba zwracana jest 50 000.

Korzystając z instrukcji RAISERROR zwraca komunikat o błędzie przez użytkownika, za pomocą wielu różnych stanu w każdym RAISERROR, która odwołuje się do tego błędu.Może to pomóc w diagnozowaniu błędów, gdy są one wywoływane.

Za pomocą instrukcji RAISERROR do:

  • Pomoc w rozwiązywaniu problemów Transact-SQL Kod.

  • Sprawdź wartości danych.

  • Zwraca wiadomości zawierających tekst zmiennej.

  • Powoduje wykonanie przejść z blok TRY do skojarzonego blok CATCH.

  • Zwraca informacje o błędzie z blok CATCH do wywoływania partia lub aplikacji.

W poniższym przykładzie zastępowane wartościami z DB_ID() i DB_NAME() funkcje w wiadomości wysyłane do aplikacji:

DECLARE @DBID INT;
SET @DBID = DB_ID();

DECLARE @DBNAME NVARCHAR(128);
SET @DBNAME = DB_NAME();

RAISERROR
    (N'The current database ID is:%d, the database name is: %s.',
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO

W tym przykładzie zawiera te same informacje za pomocą wiadomości przez użytkownika.

EXECUTE sp_dropmessage 50005;
GO
EXECUTE sp_addmessage 50005, -- Message id number.
    10, -- Severity.
    N'The current database ID is: %d, the database name is: %s.';
GO
DECLARE @DBID INT;
SET @DBID = DB_ID();

DECLARE @DBNAME NVARCHAR(128);
SET @DBNAME = DB_NAME();

RAISERROR (50005,
    10, -- Severity.
    1, -- State.
    @DBID, -- First substitution argument.
    @DBNAME); -- Second substitution argument.
GO

W poniższym przykładzie kodu pokazano, jak za pomocą instrukcji RAISERROR wewnątrz blok TRY spowodować wykonanie przejść do skojarzonego blok CATCH.Ponadto przedstawia sposób użycia instrukcji RAISERROR do zwracania informacji o błędzie, która wywołała blok CATCH.

Uwaga

RAISERROR mogą generować błędy ze stanem od 1 do 127 tylko.Ponieważ Database Engine może podnieść błędy ze stanem 0, zaleca się sprawdzenie stanu błędu zwrócony przez ERROR_STATE przed przekazaniem go jako wartość parametru stanu RAISERROR.

BEGIN TRY
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block
    RAISERROR ('Error raised in TRY block.', -- Message text.
               16, -- Severity.
               1 -- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT @ErrorMessage = ERROR_MESSAGE(),
           @ErrorSeverity = ERROR_SEVERITY(),
           @ErrorState = ERROR_STATE();

    -- Use RAISERROR inside the CATCH block to return 
    -- error information about the original error that 
    -- caused execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;