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.

14voto

Tz_ Punkte 2929

Ich habe die noexec on/off-Lösung erfolgreich mit einer Transaktion erweitert, um das Skript in einer Alles-oder-Nichts-Weise auszuführen.

set noexec off

begin transaction
go

<First batch, do something here>
go
if @@error != 0 set noexec on;

<Second batch, do something here>
go
if @@error != 0 set noexec on;

<... etc>

declare @finished bit;
set @finished = 1;

SET noexec off;

IF @finished = 1
BEGIN
    PRINT 'Committing changes'
    COMMIT TRANSACTION
END
ELSE
BEGIN
    PRINT 'Errors occured. Rolling back changes'
    ROLLBACK TRANSACTION
END

Offenbar "versteht" der Compiler die @finished-Variable in der IF, auch wenn ein Fehler aufgetreten ist und die Ausführung deaktiviert wurde. Der Wert wird jedoch nur dann auf 1 gesetzt, wenn die Ausführung nicht deaktiviert wurde. Daher kann ich die Transaktion entsprechend festschreiben oder zurücksetzen.

12voto

Jon Erickson Punkte 107332

Sie könnten Ihre SQL-Anweisung in eine WHILE-Schleife verpacken und bei Bedarf BREAK verwenden.

WHILE 1 = 1
BEGIN
   -- Do work here
   -- If you need to stop execution then use a BREAK

    BREAK; --Make sure to have this break at the end to prevent infinite loop
END

12voto

Charlie Punkte 1195

Sie können den Ablauf der Ausführung ändern, indem Sie GOTO Erklärungen:

IF @ValidationResult = 0
BEGIN
    PRINT 'Validation fault.'
    GOTO EndScript
END

/* our code */

EndScript:

11voto

jaraics Punkte 4099

Um Sglasses Methode weiter zu verfeinern, erzwingen die obigen Zeilen die Verwendung des SQLCMD-Modus und brechen den Suchlauf entweder ab, wenn der SQLCMD-Modus nicht verwendet wird, oder verwenden :on error exit bei einem Fehler zu beenden
CONTEXT_INFO wird verwendet, um den Status zu verfolgen.

SET CONTEXT_INFO  0x1 --Just to make sure everything's ok
GO 
--treminate the script on any error. (Requires SQLCMD mode)
:on error exit 
--If not in SQLCMD mode the above line will generate an error, so the next line won't hit
SET CONTEXT_INFO 0x2
GO
--make sure to use SQLCMD mode ( :on error needs that)
IF CONTEXT_INFO()<>0x2 
BEGIN
    SELECT CONTEXT_INFO()
    SELECT 'This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!'
    RAISERROR('This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!',16,1) WITH NOWAIT 
    WAITFOR DELAY '02:00'; --wait for the user to read the message, and terminate the script manually
END
GO

----------------------------------------------------------------------------------
----THE ACTUAL SCRIPT BEGINS HERE-------------

8voto

mtazva Punkte 1007

Ist dies eine gespeicherte Prozedur? Wenn ja, denke ich, dass Sie nur eine Rückkehr, wie "Return NULL" tun könnte;

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