DOSバッチファイルで実行するときにSQLステートメントの値を取得しようとしています...
sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases"
私はこの stackoverflow の質問のようにエラーレベルを追いかけているのではなく、データベースから返された実際のカウントを追いかけているので、追加のロジックを実行できます。
_-o
_ sqlcmdフラグを使用するか、標準の_>
_リダイレクタを使用して、実行結果をテキストファイルに簡単に保存できます。次に、列ヘッダー(フラグ_-h
_)を削除し、SQL Serverから行数(_SET NOCOUNT ON
_)を削除することで、このファイルをフォーマットできます。
次のスクリプトは、COUNT(1)
の値と改行のみを含むファイル_result.txt
_を生成します。
_SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1
> result.txt
_
そして、値を読み戻します...
_set /p value=< result.txt
echo %value%
_
FOR
バッチコマンドを使用してsqlcmd.exe
を呼び出すことにより、余分な/一時ファイルを回避できます。
for /F usebackq %%i in (`sqlcmd -E -S "devserver,4711" -h-1 -Q "SET NOCOUNT ON; SELECT COUNT(1) ..."`) do (
set count=%%i
)
if not defined count (
echo Failed to execute SQL statement 1>&2
) else (
echo %count%
)
いくつかの注意:
CMD.EXE
セッション、つまりコマンドラインから呼び出された場合は、%i
の代わりに%%i
を使用します。-h-1
オプションはsqlcmd.exe
に列ヘッダーを抑制するように指示するため、出力は実際には1行のテキストのみです。sqlcmd
はサーバーとポートを個別の引数として認識し、失敗します。@GerardoLimaからの回答は、そこまでの90%でした。さらに、先頭の空白を削除するには、set /a
を使用して入力値を評価する必要があります。
これは@ Christian.Kからの回答では必要ありません
SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 > result.txt
set /p raw=< result.txt
echo '%raw%'
set /a value=%raw%
echo '%value%'
私の出力は
' 0'
'0'