Ich arbeite an SQL-Skript und muss das Skript nicht mehr fortsetzen, wenn einige Bedingungen nicht erfüllt sind.
Wenn ich es google, habe ich festgestellt, dass der RaisError mit 20 Schweregraden es beenden wird. Aber aus bestimmten Gründen kann ich diese Option nicht verwenden.
Können Sie mir bitte die möglichen Alternativen zum Stoppen der Ausführung von SQL-Skripten nennen?
sql-server
sql-server-2005
error-handling
Neuer Entwickler
quelle
quelle
Antworten:
Aus der RAISERROR-Dokumentation (Schwerpunkt Mine):
Es ist sehr wahrscheinlich, dass der Principal, den Sie ausführen, diese Kriterien nicht erfüllt.
Es ist nichts Falsches an der Verwendung
RAISERROR
; Sie verwenden nur einen übermäßigen Schweregrad. Ich verwende Level 16 als Standard für einen Fehler, der ausgelöst wird und die Sequenz wird beendet. Wenn Sie genauer sein möchten, können Sie die von Microsoft selbst angegebenen Stufen befolgen:Nach alledem ist die Verwendung
RAISERROR
möglicherweise nicht ausreichend , je nach Kontext des Skripts, da das Skript nicht von selbst "beendet" wird (bei normalen Schweregraden).Beispielsweise:
Dies wird sowohl einen Fehler auslösen und eine Ergebnismenge zurück.
Um das Skript sofort zu beenden, bevorzuge ich die Verwendung
RETURN
(vonGOTO
Konstrukten des Typs -type wird in den meisten Programmierkreisen, in denen es Alternativen gibt, generell abgeraten):Oder behandeln Sie den Fehler mit
TRY/CATCH
, der dazu führt, dass die Ausführung zumCATCH
Block springt, wenn der Schweregrad 11 oder höher ist:Ein separates Problem besteht darin, dass das Skript mehrere Stapel umfasst und
RETURN
nur den Stapel beendet :Um dies zu beheben, können Sie
@@ERROR
zu Beginn jedes Stapels Folgendes überprüfen :Bearbeiten: Wie Martin Smith in den Kommentaren richtig hervorhebt, funktioniert dies nur für 2 Chargen. Um auf 3 oder mehr Stapel zu erweitern, können Sie Fehler wie
GOTO
folgt kaskadieren (Hinweis: Die Methode löst dieses Problem nicht, da das Zieletikett innerhalb des Stapels definiert werden muss):Oder, wie er auch betont, Sie können die
SQLCMD
Methode verwenden, wenn dies für Ihre Umgebung geeignet ist.quelle
Sie können die
GOTO
Anweisung verwenden, um herumzuspringen, wo immer Sie möchten. Mit anderen Worten, Sie haben einen Fehler oder eine andere Bedingung, und Sie können eine Beschriftung am unteren Rand des Skripts (dhTheEndOfTheScript:
) haben und nur einegoto TheEndOfTheScript;
Anweisung ausgeben .Hier ist ein kurzes Beispiel:
Die Ausgabe dieser Ausführung sieht folgendermaßen aus:
Wie Sie sehen,
GOTO
hat der das Drucken der dritten und vierten Anweisung übersprungen und ist direkt zum Etikett (TheEndOfTheScript
) gesprungen .quelle
Am besten verwenden Sie SET NOEXEC ON
Weitere Informationen finden Sie hier: STOPPEN oder ABBRUCHEN oder UNTERBRECHEN der Ausführung der Anweisungen im aktuellen Stapel und in den nachfolgenden Stapeln, getrennt durch die Anweisung GO, basierend auf einer Bedingung in SQL SERVER
quelle
Stimmen Sie mit dem
SET NOEXEC ON/OFF
überein, aber in gespeicherten Prozessen (die einen einzelnen Block enthalten) verwende ich einfachRETURN
Anweisung.Vorsichtsmaßnahmen: Wenn Sie in einer Skriptdatei mehrere
GO
Anweisungen haben,RETURN
wird nur der aktuelle Block verlassen und mit dem nächsten Block / Stapel fortgefahren.Hinweis:
GOTO
Sollte eine schlechte Codierungspraxis sein, wird die Verwendung von "TRY..CATCH
" empfohlen, da es seit SQL Server 2008 eingeführt wurde, gefolgt vonTHROW
2012.quelle