Kontrollstrukturen
Anweisungsblock
Begin {T-SQL Anweisung | anweisungsblock} End
IF ... Then
IF boolscher_Ausdruck T-SQL Anweisung | anweisungsblock [ELSE T-SQL Anweisung | anweisungsblock ]
case
CASE eingabeausdruck when fall1 then ergebnisausdruck1 [{when fallN then ergebnisausdruckN}] [ELSE else_ergebnisausdruck] END
while
while Boolscher_ausdruck T-SQL Anweisung | anweisungsblock
Mittels der Anweisung break kann die While- Schleife vorzeitig beendet werden. Durch continue kann die Abarbeitung des Schleifenblocks vorzeitig beendet werden, und der nächste Schleifenzyklus wird eingeläutet.
Fehlerbehandlung
Jeder Ausnahme- bzw. fehlerhafte Zustand ist eine Fehlernummer zugeordnet. Neben den Fehlernummern gibt es noch einen sog. Schweregrad. Es handelt sich hierbei um eine Klassifizierung der Fehler.
Schweregrade |
Beschreibung |
---|---|
1 bis 10 |
Statusmeldungen / Informationen |
11 bis 16 |
Benutzerdefinierte Fehlermeldungen |
17 bis 25 |
Hard und Softwarefehler |
Tritt bei einer T-SQL Anweisung ein Fehler auf, dann wird in der Systemvariabel @@ERROR eine Fehlernummer eingertragen. @@ERROR ist vom Typ Integer.
create proc del_artikel @artnr char[6] as delete from artikel where atrikelnr = @artnr if @@error <> 0 return -1 else return 0 go
Benutzerdefinierte Fehler
Mittels der Anweisung RAISERROR kann ein benutzerdefinierter Fehler generiert werden. Die Fehlernummer sollte dabei stets größer 50000 sein, und der Schweregrad zwischen 11 und 18. Systemadministratoren können mittels RAISERROR darüber hinaus auch Fehler mit Schweregraden zwischen 19 und 25 generieren.
RAISERROR (<Fehlermeldung> | <Fehlernummer>, <Schweregrad>, <Status>)
Status ist eine beliebige Zahl zw. 1 und 127.
Soll die Fehlermeldung in das Windows- Ereignisprotokoll geschrieben werden um z.B. mittels der SQL- Server Agent Warnungen diese auszuwerten, dann muß die Option With Log an RAISERROR angehangen werden:
RAISERROR (<Fehlermeldung> | <Fehlernummer>, <Schweregrad>, <Status>) WITH LOG
try.. catch Blöcke
Analog in höheren Programmiersprachen kann ab SQL Server 2005 die Fehlerbehandlung über Try- Catch Blöcke abgewickelt werden. Achtung: Status und Infomeldungen führen zu keiner Verzweigung in den catch- block.
begin try RAISERROR ('ich bin ein selbstdefinierter Fehler', 15, 2) WITH LOG print('nach Raiseerror') end try begin catch print( 'aus catch') SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage print ERROR_MESSAGE() end catch