web-dev-qa-db-ja.com

sqlcmdを使用してsqlスクリプトファイルを実行し、シェルとファイルの両方に出力する方法

次のコマンドを使用して、sqlcmdを使用してファイルからSQLスクリプトを実行しようとしています。

sqlcmd -S <server> -d <database> -i <input file> -o <output file> 
      -U <user> -P <password>

SQLファイルを実行してログファイルに出力します。

問題は、これがsqlcmdの出力をファイルに変更することです。また、シェルにも出力を取得したいと考えています。

13
Noam Shaish

@Noam、

UNIXの世界には、stdinから読み取り、stdoutandに指定のプログラムに書き込む標準プログラムがあります。ファイル: tee コマンド。次の例では、現在のディレクトリをstdoutおよび「myfile」に一覧表示します。

$ ls | tee "myfile"

wintee のようなWindows用のいくつかのオープンソースポートがあり、独自の実装を作成するのは簡単です( こちら を参照)が、PowerShellには既にこのユーティリティが組み込まれていますin: Tee-Object 次の例は、PowerShellでの前の例と類似しています。

PS [c:\tmp]
> dir | tee myDirContents.txt

したがって、次のコマンドは、現在のWindows資格情報を使用してmyscript.sqlmyserver、に実行し、その結果は、 console and to "result.txt":

PS [c:\tmp]
> sqlcmd -i mysrcipt.sql -S myserver -E | tee "result.txt"
9
Gerardo Lima

@Noam、私はSTDOUTハンドラーを複製する方法を見つけることができませんでしたが、おそらく問題を解決する1つの解決策は、sqlスクリプトを出力ファイルに実行することです(つまり、result.txt)、次にtype result.txtをSTDOUTに出力します。

c:>sqlcmd -i mysrcipt.sql -o result.txt -S myserver -E
c:>type result.txt

本当にハンドラーを複製する必要がある場合(おそらくコマンドに時間がかかり、最初の行を取得する前に完了するまで待機したくない場合)、STDINからSTDOUTに入力をコピーする簡単なプログラムを作成できます。ファイルに。次に、コマンドを次のように書き換えます。

c:>sqlcmd -i mysrcipt.sql -S myserver -E > duplicate.exe "result.txt"
3
Gerardo Lima

このコードは、認証が必要な接続に使用できます

sqlcmd -S "server_name" -d "database_name" -i "input_file" -o "output_file" -U "user_name" -P "password"
0
Erdogan