In den Online-Anweisungen für das Skript, das die TSQLTutorJoins-Beispieldatenbank aus meinen früheren Spalten erstellt, empfehle ich Ihnen, osql zu verwenden.exe, um das Skript über die Eingabeaufforderung auszuführen. Um zu demonstrieren, warum, stütze ich die Spalte dieses Monats auf RAISERROR und einen coolen Trick, den ich über die Verwendung des Statusparameters der RAISERROR Anweisung gelernt habe. Mit einem speziellen Wert für den RAISERROR-Statusparameter können Sie die Beendigung eines komplexen Skripts erzwingen und dessen Ausführung in der falschen Datenbank verhindern.,
RAISERROR hat drei Hauptkomponenten: den Fehlertext, den Schweregrad und den Status. Der Fehlertext kann entweder eine fest codierte oder parametrisierte Nachricht oder eine Fehlernummer aus einer permanenten benutzerdefinierten Nachricht sein. So erstellen Sie Ihre eigenen permanenten Nachrichten, siehe SQL Server Books Online (BOL) zur Verwendung der im System gespeicherten Prozedur sp_addmessage.
Schweregrad hat mehrere definierte Ebenen. Vom Entwickler definierte Fehler liegen im Schweregrad von 1 bis 16, wobei 16 am häufigsten und der Standardwert ist. Allerdings funktionieren nicht alle Schweregrade gleich., Tabelle 1 zeigt die Schweregradkategorien, wie sie Nachrichten in Query Analyzer anzeigen und wie sie optional im Anwendungsprotokoll der Ereignisanzeige protokolliert werden. Um Nachrichten in der Ereignisanzeige zu protokollieren, können Sie mit LOG in Ihrer RAISERROR-Anweisung verwenden oder die permanente Nachricht mithilfe von sp_addmessage erstellen, wobei der Parameter with_log auf ‚TRUE’gesetzt ist. Die letztere Option schreibt jedes Auftreten dieses Fehlers in das Anwendungsprotokoll der Ereignisanzeige, auch wenn RAISERROR nicht MIT LOG angibt., Die vereinfachte RAISERROR-Syntax lautet
RAISERROR (error, severity, state) WITH LOG
Beispielsweise gibt
RAISERROR ('Test Severity 16', 16, 1) WITH LOG
den folgenden Fehler an das Nachrichtenfenster im Abfrageanalysator zurück:
Error Number InfoServer: Msg 50000, Level 16, State 1, Line 1Error Text Test Severity 16
Die erste Zeile ist die Fehlernummer Info, wie Tabelle 1 beschreibt. Query Analyzer zeigt diese Informationen für Schweregrad 10 nicht an. Die Anzeigefarbe wechselt von schwarz für die Schweregrade 1 bis 9 zu rot für 11 und höher. Das Beispielskript in Listing 1 zeigt zusätzliche Syntax und Ideen für die Verwendung von RAISERROR, einschließlich der Verwendung mehrerer Sprachen und Parametrierung., Weitere Informationen zur Verwendung von RAISERROR und den verschiedenen Schweregraden finden Sie unter BOL unter den folgenden Themen: Fehlermeldungen, Schweregrade für Fehlermeldungen, RAISERROR, Verwenden von RAISERROR, FORMATMESSAGE und xp_logevent.
Zusätzlich zum Schweregrad unterstützt RAISERROR auch einen Status. Viele Objekterstellungsskripte erstellen eine Datenbank und dann Tabellen, Prozeduren usw. in der neu erstellten Datenbank. Aber was ist, wenn das Skript die Datenbank nicht richtig erstellt hat? Alle zusätzlichen Objekte (z.,, tabellen, Prozeduren) in Ihrer Standarddatenbank erstellt, die für Systemadministratoren möglicherweise Master ist. Erstellen Sie alle Ihre benutzerdefinierten Datenbankobjekte in der Master-Datenbank ist genau das, was Sie nicht wollen, so dass, wenn Sie einen automatisierten Prozess Skripting sind, können Sie einen Wert für den Zustand, der das Skript beendet, wenn ein fataler (von Ihrer Definition) Fehler auftritt.
Das Festlegen des Statuswerts scheint die Sitzung jedoch nicht immer zu beenden. Anwendungen wie Query Analyzer stellen die Verbindung möglicherweise automatisch wieder her, wenn eine Verbindung unterbrochen wird., Um den Vorteil der Statusoption vollständig zu sehen, müssen Sie ein Tool wie osql verwenden.exe, die sich nach einer Unterbrechung der Verbindung nicht automatisch wieder verbindet. Hier ist eine Möglichkeit, die Statusoption zu testen. Geben Sie an der Eingabeaufforderung
osql -E -q"RAISERROR('Test Severity 16', 16, 1) WITH LOG"
Dieser Code gibt
Test Severity 161>
zurück und Sie bleiben in osql.exe. Wenn Sie die folgende Zeile über eine Eingabeaufforderung ausführen:
osql -E -q"RAISERROR('Test State 127', 16, 127) WITH LOG"
gibt die Fehlermeldung
Test State 127
zurück und gibt Sie an die Eingabeaufforderung zurück, wobei Sie von osql beendet werden.exe. Wenn Sie osql.,exe um einen Fehler mit dem Status 127 auszulösen, nachdem eine Datenbankerstellung fehlgeschlagen ist, beendet der Fehlerstatus die Verbindung und folglich den Rest des Skripts, sodass Sie keine Objekte in der falschen Datenbank erstellen.
Am Anfang des Datenbankerstellungsskripts TSQLTutorJoins.sql, das über den Link „Code herunterladen“ oben auf der Seite verfügbar ist, enthält den folgenden Code:
Wenn die Datenbank nicht erstellt wird, ist die Verbindung unterbrochen und der Objekterstellungsteil des Skripts wird nicht ausgeführt. Ich habe es so eingerichtet, dass Sie feststellen können, was die Fehler sind (z.,, außerhalb des Speicherplatzes, falscher Pfad), bevor der Rest des Skripts ausgeführt wird. Wenn ohne diesen Code die Datenbankerstellung fehlschlägt und das Skript fortgesetzt wird, werden alle Testobjekte in Ihrer Standarddatenbank erstellt.
Wenn Sie Skripte automatisieren, kann das Beenden der Ausführung bei einem schwerwiegenden Fehler äußerst nützlich sein. Indem Sie einen Fehler mit hohem Schweregrad auslösen, ihn im Anwendungsprotokoll der Ereignisanzeige protokollieren und, was noch wichtiger ist, ihn mit dem Status 127 erhöhen, stellen Sie sicher, dass keine Skriptobjekte in der falschen Datenbank erstellt werden., Wenn Sie es außerdem im Anwendungsprotokoll der Ereignisanzeige anmelden, haben Sie einen Audit-Trail des Ereignisses.