2016-03-19 11 views
1

Ich habe das untenstehende Bit von VBS, die eine * .sql-Abfrage über SQLCMD aufruft und ausführt.Capture VBS objshell.Run Fehler

Wie kann ich die Fehlerprüfung verbessern? Wenn ich die * .sql-Datei lösche, denkt sie, dass sie erfolgreich abgeschlossen wurde, obwohl sie es nicht haben konnte.

Writelog "Attempting to run *.sql" 
err = objshell.Run ("cmd /c sqlcmd -U sa -P Password -i c:\temp\abc.sql",1,FALSE) 
If err <> 0 Then 
    WriteLog "Error running SQL = " & err & "(" & err.description & ")" 
Else 
    WriteLog "Successfully run SQL" 
End If 
+4

lesen helfen _bWaitOnReturn Optional. Boolescher Wert, der angibt, ob das Skript auf die Ausführung des Programms warten soll, bevor es mit der nächsten Anweisung in Ihrem Skript fortfährt. Wenn diese Eigenschaft auf "true" gesetzt ist, wird die Skriptausführung angehalten, bis das Programm beendet wird, und "Run" gibt den vom Programm zurückgegebenen Fehlercode zurück. Wenn sie auf false gesetzt ist (der Standardwert), kehrt die Run-Methode unmittelbar nach dem Start des Programms zurück und gibt automatisch 0 zurück (nicht als Fehlercode zu interpretieren) ._ –

+0

Perfekt - vielen Dank – Qazxswe

Antwort

2

Wie @Noodles zeigte in den Kommentaren zu Ihrer Frage aus Sie den dritten Parameter der Run Methode (bWaitOnReturn) zu True, so dass Ihre VBScript warten auf den externen Befehl auszuführen einstellen müssen.

Das allein reicht jedoch nicht aus. Sie müssen auch sqlcmd mit dem zusätzlichen Parameter ausführen -b, um es im Fall eines Fehler einen von Null verschiedenen Exit-Code zu machen zurück:

-b

Specifies that sqlcmd exits and returns a DOS ERRORLEVEL value when an error occurs. The value that is returned to the DOS ERRORLEVEL variable is 1 when the SQL Server error message has a severity level greater than 10; otherwise, the value returned is 0. If the -V option has been set in addition to -b , sqlcmd will not report an error if the severity level is lower than the values set using -V . Command prompt batch files can test the value of ERRORLEVEL and handle the error appropriately. sqlcmd does not report errors for severity level 10 (informational messages).

If the sqlcmd script contains an incorrect comment, syntax error, or is missing a scripting variable, ERRORLEVEL returned is 1.

Und Sie brauchen nicht cmd /c, weil externer Befehl keine internationalen Integrierte CMD-Funktionen (wie interne Befehle, Pipeline oder Umleitung).

Verwenden Sie auch nicht err als Variablenname. VBScript verfügt über ein internes globales Objekt Err für die Bereitstellung von Laufzeitfehlerinformationen, die automatisch ausgefüllt werden, wenn ein Laufzeitfehler auftritt. Wenn Sie versuchen, einen Wert zuzuweisen, sollte dies zu einem Fehler führen.

Ändern Sie Ihren Code so etwas wie dieses:

rc = objshell.Run("sqlcmd -b -U sa -P Password -i c:\temp\abc.sql", 1, True) 
If rc <> 0 Then 
    WriteLog "Error running SQL = " & rc 
Else 
    WriteLog "Successfully run SQL" 
End If