mk-prg-net \ ms-sql \ tsql \controlblocks

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