2

毎日実行するようにスケジュールされた SQL Server エージェント ジョブがあります。2 つのステップのうち最初のステップでは、クエリの結果をファイルに書き込む SSIS パッケージを呼び出します。2 番目のステップでは、日付を含むようにファイルの名前を変更し、ファイルをパートナーの FTP サイトにアップロードし、ファイルをアーカイブ ディレクトリに移動してクリーンアップするバッチ ファイルを実行します。これは通常正常に動作します。

ただし、ジョブが正常に完了したという通知が送信されない場合があります。サーバーにログインすると、ftp.exe がまだ実行されていることがわかりますが、ファイルはアップロードされておらず、アーカイブにも移動されていません。FTP プロセスを終了すると、ジョブは続行され、ファイルの移動とクリーンアップが行われます。ジョブ履歴を見ると、これらの失敗したケースで 2 つの異なるシナリオが明らかになります。最初に、接続が確立されますが、最後に表示される FTP 出力は、ジョブが正常に実行された場合と同様に -- there ではあり150 Opening data channel for file transfer.ません。226 Transfer OK2 番目のシナリオは、接続が確立されていないため、接続が開いていないときにスクリプトがオフになり、ログインしようとすることです。

以下は、ホスト、ユーザー、およびパスが変更されたスクリプトです。

@echo off
setlocal

D:
cd D:\Backups

set file_name=ssis_output.txt
set new_file_name=SDCL.%date:~-4,4%-%date:~-10,2%-%date:~-7,2%-00-00-00.txt

set user=XXXXXXXXXXXXX
set pass=XXXXXXXXXXXXX
set host=XXXXXXXXXXXXX

ren "%file_name%" "%new_file_name%"

echo user %user%> ftpcmd.dat
echo %pass%>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %new_file_name%>> ftpcmd.dat
echo close>> ftpcmd.dat
echo bye>> ftpcmd.dat
ftp -n -s:ftpcmd.dat %host%
del ftpcmd.dat
move %new_file_name% data_files

私がやりたいことは、バッチ ファイルにエラー検出を含める方法を見つけることです。これにより、FTP 接続が確立されていないか、転送が完了する前にタイムアウトした場合、スクリプトがそれを認識して失敗し、ジョブが失敗するようになります。適切な通知を送信します。さらに良いことに、接続が失敗すると、適切な一時停止の後、最終的に放棄して失敗を報告する前に、いくつかの追加の試行が行われます。

編集: WinSCP などの別のフリーウェア FTP クライアントをインストールすることに反対しているわけではありません。

4

2 に答える 2