2016-03-19 31 views
1

私は、SQLCMDを介して* .sqlクエリを呼び出して実行するVBSのビットがあります。キャプチャVBS objshell.Runエラー

エラーチェックを改善するにはどうすればよいですか? * .sqlファイルを削除すると、それができなかったとしても正常に完了したと考えられます。

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

読むには、オプションの_bWaitOnReturn を助けます。スクリプト内の次のステートメントに進む前にスクリプトがプログラムの実行を終了するのを待つかどうかを示すブール値。 trueに設定すると、スクリプトの実行はプログラムが終了するまで停止し、Runはプログラムから返されたエラーコードを返します。 false(デフォルト)に設定すると、Runメソッドはプログラムの開始直後に自動的に0を返します(エラーコードとして解釈されません)。_ –

+0

パーフェクト - 多くのありがとう – Qazxswe

答えて

2

@Noodlesは、あなたの質問にコメントで指摘したように、あなたのVBScriptを完了するために外部コマンドを待機するようにTrueRun方法(bWaitOnReturn)の三番目のパラメータを設定する必要があります。

しかし、それだけでは十分ではありません。また、それがエラーの場合にはゼロ以外の終了コードを返すようにするために、追加のパラメータ-bsqlcmdを実行する必要があります。

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

そして、あなたの外部コマンドはいずれも使用しないので、あなたは、cmd /cを必要としませんCMD組み込み機能(内部コマンド、パイプライン、リダイレクトなど)

また、errを変数名として使用しないでください。 VBScriptにはランタイムエラー情報を提供するための固有グローバルオブジェクトErrがあります。ランタイムエラーが発生すると、自動的に読み込まれます。値を代入しようとするとエラーが発生します。

変更するには、このような何かにあなたのコード:

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