DOSバッチファイルでSQLステートメントを実行するときにSQLステートメントの値を取得しようとしています...
sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases"
私はこのstackoverflowの質問のようにエラーレベルの後であるのではなく、データベースから返された実際のカウントの後であるので、いくつかの追加のロジックを実行できます。
DOSバッチファイルでSQLステートメントを実行するときにSQLステートメントの値を取得しようとしています...
sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases"
私はこのstackoverflowの質問のようにエラーレベルの後であるのではなく、データベースから返された実際のカウントの後であるので、いくつかの追加のロジックを実行できます。
-o
sqlcmdフラグを使用するか、標準の>
リダイレクタを使用することにより、実行結果をテキストファイルに簡単に保存できます。-h
次に、列ヘッダー(フラグ)を削除し、SQL Server()から行数を削除することで、このファイルをフォーマットできますSET NOCOUNT ON
。
次のスクリプトはresult.txt
、の値COUNT(1)
と改行のみを含むファイルを生成します。
SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1
> result.txt
そして、値を読み戻します...
set /p value=< result.txt
echo %value%
batchコマンドをsqlcmd.exe
使用して呼び出すことにより、余分な/一時ファイルを回避できます。FOR
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'