我有一个每天运行的 SQL Server 代理作业。两个步骤中的第一步调用一个 SSIS 包,它将查询结果写入文件。第二步执行一个批处理文件,该文件重命名文件以包含日期,将文件上传到合作伙伴的 FTP 站点,将文件移动到存档目录并进行清理。这通常工作正常。
但是,有时不会发送作业成功完成的通知。当我登录服务器时,我看到 ftp.exe 仍在运行,但该文件尚未上传或移动到存档中。当我终止 FTP 进程时,作业继续,移动文件并清理。查看作业历史可以揭示这些失败案例中的两种不同情况。首先,建立了连接,但最后看到的 FTP 输出是150 Opening data channel for file transfer.
--there is no 226 Transfer OK
,因为有成功的作业运行。第二种情况是连接从未建立,因此脚本关闭并在没有打开连接时尝试登录。
这是包含主机、用户和密码的脚本:
@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 连接未建立或在传输完成之前超时,脚本会识别出该连接并失败,从而使作业失败并发送适当的通知。更好的是,连接失败会导致在适当的暂停后进行几次额外的尝试,然后最终放弃并报告失败。
编辑:我不反对安装不同的免费软件 FTP 客户端,例如 WinSCP,如果这有助于找到解决方案。