368 Stimmen

SQL Server - Anhalten oder Unterbrechen der Ausführung eines SQL-Skripts

Gibt es eine Möglichkeit, die Ausführung eines SQL-Skripts in SQL Server sofort zu stoppen, z. B. mit einem "break"- oder "exit"-Befehl?

Ich habe ein Skript, das einige Überprüfungen und Nachforschungen durchführt, bevor es mit dem Einfügen beginnt, und ich möchte, dass es anhält, wenn eine der Überprüfungen oder Nachforschungen fehlschlägt.

7voto

jerryhung Punkte 1023

Ich benutze RETURN hier die ganze Zeit, arbeitet in Script oder Stored Procedure

Stellen Sie sicher, dass Sie ROLLBACK die Transaktion, wenn Sie sich in einer solchen befinden, ansonsten RETURN führt sofort zu einer offenen, nicht gebundenen Transaktion

7voto

John Sansom Punkte 40295

Ich würde vorschlagen, dass Sie Ihren entsprechenden Codeblock in einen Try-Catch-Block einschließen. Sie können dann das Ereignis Raiserror mit einem Schweregrad von 11 verwenden, um den Catch-Block zu unterbrechen, wenn Sie dies wünschen. Wenn Sie nur Fehler auslösen, aber die Ausführung innerhalb des try-Blocks fortsetzen möchten, verwenden Sie einen niedrigeren Schweregrad.

Macht das Sinn?

Zum Wohl, John

[Bearbeitet, um BOL-Referenz aufzunehmen]

http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx

5voto

Rob Garrison Punkte 6664

Keines dieser Verfahren funktioniert mit 'GO'-Anweisungen. In diesem Code erhalten Sie unabhängig davon, ob der Schweregrad 10 oder 11 ist, die abschließende PRINT-Anweisung.

Test-Skript:

-- =================================
PRINT 'Start Test 1 - RAISERROR'

IF 1 = 1 BEGIN
    RAISERROR('Error 1, level 11', 11, 1)
    RETURN
END

IF 1 = 1 BEGIN
    RAISERROR('Error 2, level 11', 11, 1)
    RETURN
END
GO

PRINT 'Test 1 - After GO'
GO

-- =================================
PRINT 'Start Test 2 - Try/Catch'

BEGIN TRY
    SELECT (1 / 0) AS CauseError
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage
    RAISERROR('Error in TRY, level 11', 11, 1)
    RETURN
END CATCH
GO

PRINT 'Test 2 - After GO'
GO

Ergebnisse:

Start Test 1 - RAISERROR
Msg 50000, Level 11, State 1, Line 5
Error 1, level 11
Test 1 - After GO
Start Test 2 - Try/Catch
 CauseError
-----------

ErrorMessage
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Divide by zero error encountered.

Msg 50000, Level 11, State 1, Line 10
Error in TRY, level 11
Test 2 - After GO

Die einzige Möglichkeit, dies zu erreichen, besteht darin, das Skript ohne GO Erklärungen. Manchmal ist das ganz einfach. Manchmal ist es ziemlich schwierig. (Verwenden Sie etwas wie IF @error <> 0 BEGIN ... .)

4voto

Mladen Prajdic Punkte 15257

Können Sie RAISERROR .

3voto

Das war meine Lösung:

...

BEGIN
    raiserror('Invalid database', 15, 10)
    rollback transaction
    return
END

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X