18

DOSバッチファイルでSQLステートメントを実行するときにSQLステートメントの値を取得しようとしています...

sqlcmd -E -S DEVSERVER -Q "SELECT  COUNT(1) as [CaseCount] FROM Cases"

私はこのstackoverflowの質問のようにエラーレベルの後であるのではなく、データベースから返された実際のカウントの後であるので、いくつかの追加のロジックを実行できます。

4

3 に答える 3

19

-osqlcmdフラグを使用するか、標準の>リダイレクタを使用することにより、実行結果をテキストファイルに簡単に保存できます。-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%
于 2012-05-03T10:20:49.193 に答える
19

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行のテキストのみです。
  • サーバーで架空のポート4711を使用して、「server、port」仕様全体を二重引用符で囲む必要があることを示しました。そうしないと、CMDのコマンドライン解析ルールにより、sqlcmdサーバーとポートが個別の引数として認識され、失敗します。
于 2012-05-03T10:30:52.740 に答える
4

@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'
于 2015-11-11T16:21:40.910 に答える