web-dev-qa-db-ja.com

SQLエージェントジョブでバッチファイルを正常に実行する方法

PDFファイルで特定のレポートを生成し、PDFをネットワークディレクトリにコピーして、PDFファイルをソースディレクトリ。

SQLジョブは2つのステップで構成されています。1.レポートを生成します。2.レポートをネットワークの場所にコピーします。

ステップ2では、pdfファイルのコピーと削除を処理するbatファイルを作成しました。

Batファイルは次のとおりです。

set source_dir=C:\Reports\Energie\Uur
set dest_dir=\\KWS2-WEB-SERVER\Share\Reports\Uur

C:\Windows\System32\Robocopy.exe %source_dir% %dest_dir% /MOV /Z

ただし、ジョブを実行すると、2番目のステップでハングします。ステータスは「実行中」のままです。

これは、ステップで述べた行(実行するbatファイルの場所)です。

cmd.exe /c "C:\Reports\rapport_uur_copy.bat"

私の仕事の設定は次のとおりです。

ステップ1

タイプ:オペレーティングシステム(CmdExec)成功時:次のステップに進む

失敗時:ジョブレポートの失敗を終了します

ステップ2

タイプ:オペレーティングシステム(CmdExec)

成功時:成功を報告するジョブを終了します

失敗時:ジョブレポートの失敗を終了します

いくつかの事実:

  • ネットワークディレクトリに対する読み取り/書き込み権限を持っています
  • 手順を管理者アカウント(ログインしたユーザー、デフォルト)として実行します
  • ステップ1は成功
  • Windows Server 2008 R2 Standardを実行しています
  • SQL Server 2008 R2を持っています
  • Cmdから手動でスクリプトを実行すると、(管理者アカウントで)機能します。
5
Nazeem

\ KWS2-WEB-SERVER\Share\Reports\Uur共有への書き込み権限と読み取りアクセス権限を持つドメインアカウントとして実行するには、ジョブの2番目のステップを構成する必要があるようですC:\ Reports\Energie\Uurフォルダーに移動します。

最初に、資格情報をSQL Serverに追加する必要があります。 Security> Credentialsフォルダから、右クリックしてNew Credential ...を選択する必要があります。その情報を入力して、[OK]をクリックします。

それが完了したら、この資格情報を使用するプロキシを作成する必要があります。 SQL Serverエージェント>プロキシ>オペレーティングシステム(CmdExec)フォルダーから右クリックして選択新しいプロキシ...先に作成した資格情報を使用する必要があります。

これで、ジョブステップページのRun As:ドロップダウンを使用して、作成したプロキシを使用するように2番目のジョブステップを構成できます。

2
Brian Bentley

通常、このようなジョブがハングするのは、コマンドの実行が応答を待っているためです。 SQL Serverから実行されるコマンド実行はすべてシェルとして実行され、シェルを表示できないため、応答を取得できません。私だったら、batファイルを手動で実行してみて、応答を求められるかどうかを確認します。その場合はその部分を修正し(応答を要求しないように)、再試行してください。

自分で実行しても問題が解決しない場合は、xp_cmdshellを使用して実行し、出力が返されるかどうかを確認してください。それでもハングアップする可能性があります。

2
Kenneth Fisher

以前に作成したスクリプトで\ CR\LFで区切るすべてのステップは、次の2つのオプションのいずれかを選択した場合にのみAgentJobで実行できます。

  • バットスクリプトのEvereyの別の行は、AgentJobの別の手順である必要があります
  • すべての\ CR\LFを削除し、AgentJobのステップに&&コマンド間
1
Clevemayer

私はまったく同じ問題を抱えていました。 SQLジョブがハングして「実行中...」と表示され、完了しませんでした。

.batファイルに「--trust-model always」を追加します。

基本的に、.batファイルは所有者であるため、手動で実行すると実行されます。それはあなたを信頼しています。別のユーザーとして.batを実行すると、cmdは実際に警告を表示し、信頼できるかどうかを尋ねます。 cmdが回答を待っているため、ジョブがハングしています。 「--trust-model always」を追加すると、この質問はスキップされ、.batが終了します。

私を信じて。 :)

1
snarkmark