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 ;THROWals 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.