Der Schweregrad 16
kann die Ausführung beenden.
Vorsichtsmaßnahmen beim Versuch mit RAISERROR ():
RAISERROR()
mit einem Schweregrad von 16 wird die Ausführung für alles unterhalb der betreffenden Linie beendet.
Doch dies nur gilt , wenn innerhalb eines Try-Blöcke.
RAISERROR (N'Before Try: Raise-Error 16.', 16, 0)
SELECT 'Before Try: Select.'[Marker]
BEGIN TRY
RAISERROR (N'Inside Try: Raise-Error 16.', 16, 0)
SELECT 'Inside Try: Select.'[Marker]
END TRY
BEGIN CATCH
RAISERROR (N'Inside Catch: Raise-Error 16.', 16, 0)
SELECT 'Inside Catch: Select.'[Marker]
END CATCH
RAISERROR (N'After Try-Catch: Raise-Error 16.', 16, 0)
SELECT 'After Try-Catch: Select.'[Marker]
Überrascht? So war I.
Was warf mich auch für eine Schleife nicht alle Severity- ist 16 ‚s gleich sind.
Wenn Sie die Divide-By-Zero-Linie ganz oben auskommentieren würden, würde nichts darunter laufen.
The Divide-By-Zero - Logik wird auch erzeugen eine Severity- 16 Ausnahme,
aber es ist mit einem handVollAnschlag , anders als wenn sie geworfen mit RAISERROR()
.
Hinweis: Verwenden Sie diese Option ;THROW
als letzte Zeile in Ihrem Catch-Block, um
die SQL-Ausnahme für das RAISERROR()
von Ihrem Try-Block ausgelöste Ereignis ordnungsgemäß auszulösen.
Dadurch wird die Ausführung effektiv mit einem Punkt gestoppt.
Das ;
Semikolon ist erforderlich, wenn vor dem Aufruf andere Zeilen im Catch-Block vorhanden sind ;THROW
.
Wenn Ihre Logik richtig den Fehler in dem Catch - Block behandelt (und Sie würden die Verarbeitung fortfahren ,
den Rest der Logik , nachdem es), dann kann nicht verwendet werden ;THROW
.
Fazit:
Kombinieren Sie einen von der SQL-Server-Engine ausgelösten Schweregrad 16 nicht
mit einem, den Sie selbst erhöhen RAISERROR()
.
Berücksichtigen Sie in jeder Hinsicht (wenn Sie absichtlich Ihre eigenen Fehler auslösen) nur 2 Schweregrade:
0 (zur Information oder Warnung) und
16 (zum Auslösen einer Ausnahme, die in einem Try-Block behandelt wird - um sie in den Catch-Block zu werfen). .
Informationen jetzt!
Hinweis: Wenn Sie RAISERROR()
zum Anzeigen von Informationsnachrichten verwenden,
empfehle ich Folgendes WITH NOWAIT
:
RAISERROR('Read me right now!', 0, 1) WITH NOWAIT
RAISERROR('Read me whenever.' , 0, 1)
DECLARE @WaitSeconds Int = 10
DECLARE @WaitFor DateTime = DATEADD(SECOND, @WaitSeconds, 0)
WAITFOR DELAY @WaitFor
Dies ist besonders nützlich bei langen Batch-Vorgängen, wenn Sie einen Einblick
in den Fortschritt erhalten möchten, wenn Sie bestimmte Meilensteinmarkierungen im gesamten Batch erreichen.
Wenn Sie nicht verwenden WITH NOWAIT
, wissen Sie möglicherweise nie, wann Ihre Informationsnachrichten angezeigt werden.
Sie können zeitweise im Verlauf der Charge oder auf einmal auftreten, wenn die Charge abgeschlossen ist.