Verwenden von RAISERROR

RAISERROR wird zum Zurückgeben von Meldungen an Anwendungen verwendet, die das gleiche Format wie ein Systemfehler oder eine von SQL Server-Datenbankmodul generierte Warnmeldung aufweisen.

RAISERROR kann Folgendes zurückgeben:

  • Eine benutzerdefinierte Fehlermeldung, die mithilfe der gespeicherten Systemprozedur sp_addmessage erstellt wurde. Dabei handelt es sich um Meldungen mit einer Meldungsnummer größer als 50000, die in der sys.messages-Katalogsicht angezeigt werden können.
  • Eine in der RAISERROR-Anweisung angegebene Meldungszeichenfolge.

Darüber hinaus können Sie mit RAISERROR Folgendes ausführen:

  • Zuweisen einer bestimmten Fehlernummer, eines Schweregrades und eines Status.
  • Festlegen, dass der Fehler im Datenbankmodul-Fehlerprotokoll und im Microsoft Windows-Anwendungsprotokoll protokolliert wird.
  • Ersetzen von Argumentwerten im Meldungstext (ähnlich wie die printf-Funktion der Programmiersprache C).

RAISERROR und PRINT können zum Zurückgeben von Informations- oder Warnmeldungen an eine Anwendung verwendet werden. Der Meldungstext, der von RAISERROR zurückgegeben wird, kann mithilfe von Zeichenfolge-Ersetzungsfunktionen erstellt werden, die der printf-Funktion der C-Standardbibliothek ähneln, während PRINT nur eine Zeichenfolge oder einen Zeichenausdruck zurückgeben kann. Ein RAISERROR-Schweregrad von 11 bis 19 in einem TRY-Block eines TRY…CATCH-Konstrukts bewirkt, dass die Steuerung an den zugehörigen CATCH-Block übertragen wird. Geben Sie einen Schweregrad von 10 oder geringer an, um Meldungen mithilfe von RAISERROR zurückzugeben, ohne einen CATCH-Block aufzurufen. PRINT übergibt die Steuerung nicht an einen CATCH-Block.

Wenn RAISERROR mit der Meldungs-ID (msg_id) einer benutzerdefinierten Meldung in sys.messages verwendet wird, wird msg_id als SQL Server-Fehlernummer oder systemeigener Fehlercode zurückgegeben. Wird RAISERROR mit einer Meldungszeichenfolge (msg_str) statt mit einer Meldungs-ID (msg_id) verwendet, lautet die zurückgegebene SQL Server-Fehlernummer und systemeigene Fehlernummer 50000.

Wenn Sie RAISERROR verwenden, um eine benutzerdefinierte Fehlermeldung zurückzugeben, sollten Sie eine andere Statusnummer in jeder RAISERROR-Anweisung verwenden, die auf diesen Fehler verweist. Dies kann bei der Diagnose der Fehler helfen, wenn sie ausgelöst werden.

Verwenden Sie RAISERROR für folgende Aufgaben:

  • Unterstützung bei der Problembehandlung von Transact-SQL-Code.
  • Überprüfen der Werte von Daten.
  • Zurückgeben von Meldungen, die variablen Text enthalten.
  • Veranlassen der Ausführung zu einem Sprung von einem TRY-Block zum zugehörigen CATCH-Block.
  • Zurückgeben von Fehlerinformationen vom CATCH-Block an den aufrufenden Batch oder die Anwendung.

Das folgende Beispiel fügt die Rückgabewerte der DB_ID()- und DB_NAME()-Funktionen mithilfe der Ersetzung in eine an die Anwendung zurückgesendete Meldung ein:

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

Dieses Beispiel stellt die gleichen Informationen mithilfe einer benutzerdefinierten Meldung bereit:

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

Das folgende Codebeispiel zeigt, wie RAISERROR in einem TRY-Block verwendet wird, damit die Ausführung zum zugehörigen CATCH-Block springt. Es zeigt außerdem, wie RAISERROR zum Zurückgeben von Informationen zu dem Fehler verwendet werden kann, der einen CATCH-Block aufgerufen hat.

ms177497.note(de-de,SQL.90).gifHinweis:
RAISERROR kann nur Fehler mit dem Status 1 bis 127 generieren. Da Datenbankmodul u. U. Fehler mit dem Status 0 ausgibt, wird empfohlen, den von ERROR_STATE zurückgegebenen Fehlerstatus zu überprüfen, bevor Sie ihn als Wert an den Statusparameter von RAISERROR weitergeben.
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;

Siehe auch

Konzepte

Verwenden von @@ERROR
Verwenden von PRINT
Verwenden von TRY...CATCH in Transact-SQL
Behandeln von Fehlern und Meldungen in Anwendungen
Behandeln von Fehlern von remote gespeicherten Server-zu-Server-Prozeduren

Andere Ressourcen

RAISERROR (Transact-SQL)
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005