1

osql を呼び出すバッチ ファイルから、Invoke-Sqlcmd コマンドレットを使用する Powershell スクリプトに移行しています。

osql で -o フラグを使用して、後者の場合に出力をリダイレクトするための同等の手順を知っている人はいますか? osql 出力ファイルを見て、それに応じて動作するいくつかの後処理手順があります (これらのログが X バイトを超える場合はエラーを報告します)。Invoke-Sqlcmd が、同じ SQL コマンドが入力された場合に同じ出力情報を複製できれば、非常に気に入っています。

現在、スクリプトで を呼び出す予定ですInvoke-Sqlcmd <...> | Out-file -filepath myLog.log。これが大丈夫か、理にかなっているのか誰にもわかりますか?

4

3 に答える 3

1

osqlPowerShell から引き続き呼び出すことができます。私はそれを続けます。 Invoke-SqlCmd結果セットの各行を表すオブジェクトを返します。これらのオブジェクトで何もしないのであれば、 にアップグレードする理由はありませんInvoke-SqlCmd

于 2012-09-04T01:44:48.593 に答える
1

私が持っているのと同じ動作をinvoke-sqlcmdで再現するのは難しいと思うでしょう。

osql および sqlcmd.exe は、T-SQL PRINT および RAISERROR とエラーを出力ファイルに送信します。

Powershell を使用すると、標準エラー リダイレクト手法 (2>&1) で標準エラーを標準出力にリダイレクトできます。

Invoke-Sqlcmd <...>  2>&1 | Out-file -filepath myLog.log

ただし、これでもすべてをキャッチすることはできません。たとえば、Invoke-sqlcmd のヘルプに記載されているように、-verbose パラメーターを使用すると、RAISERROR および PRINT ステートメントは Invoke-sqlcmd でのみ出力されます。Powershell V2 では、詳細出力をリダイレクトできません。4>を使用してPowershell V3を使用できますが

これらの理由やその他 (sqlcmd でさまざまなオプションをすべて再作成しようとするなど) のために、環境でスケジュールされたジョブに sqlcmd.exe を使用するように切り替えました。osql.exe は廃止されたため、osql と同じオプションをサポートする sqlcmd.exe に切り替えることをお勧めします。

于 2012-08-30T01:07:21.257 に答える
1

コマンドレット自体のドキュメントから:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"

上記は、Invoke-Sqlcmd を呼び出し、入力ファイルを指定し、出力をファイルにパイプする例です。これは、-i および -o オプションで sqlcmd を指定するのと似ています。

http://technet.microsoft.com/en-us/library/cc281720.aspx

于 2012-08-29T17:52:07.263 に答える