没有文件可下载时,如何避免SSIS FTP任务失败?
我正在使用SQL Server 2005,并在SSIS中创建ftp任务。
有时会有文件通过ftp传输,有时没有。如果没有文件,我不希望任务或者程序包失败。我已将箭头从ftp任务更改为"完成"旁边的箭头,因此程序包一直运行。我已将允许的错误数量更改为4(因为有4个ftp任务,并且这4个目录中的任何一个都可能具有文件,也可能没有文件)。
但是,当我从代理中的作业运行程序包时,它将作业标记为失败。由于此操作每15分钟运行一次,因此我不想在工作历史记录中出现一堆红色的x,这将使我们在确实发生问题时不会看到任何问题。
如何在ftp任务中设置属性,以便不向ftp查找文件不会失败?我正在使用的操作是"发送文件"。
这是更多信息:这些文件位于除ftp之外我无权访问的服务器上。而且,我不提前知道文件名。用户可以随便呼叫他们。因此,我无法检查特定文件,也无法检查所有文件。除非通过使用ftp连接以及基于该连接的任务。这些文件位于远程服务器上,我想将它们复制到我的服务器上,以从该远程服务器上获取它们。
我可以在脚本任务中使用命令级别的ftp。也许那是我需要使用而不是ftp任务的东西。 (我已更改为使用带有参数文件的ftp命令行,该文件从脚本任务中调用。当没有文件要获取时,它不会出错。我认为该解决方案将对我有用。参数文件,这意味着我不需要在纯文本文件中包含连接信息,而可以将其存储在配置文件中,该文件位于更安全的位置。)
解决方案
我没有打包的答案给我们,但是由于没有人发布过任何东西……
我们应该能够在ActiveX脚本任务中设置一个变量,然后使用该变量来决定是否应运行FTP任务。这里有一个使用本地路径的示例。希望我们可以适应该概念(或者,如果可能,请映射FTP驱动器并以这种方式进行操作)。
将其放在ForEach容器中,该容器会遍历要上传的文件。没有文件,没有FTP,没有故障。
我们可以在失败时重定向到另一个不执行任何任务的任务,即仅返回true的脚本。
为此,添加新的脚本任务,突出显示FTP任务,将出现另一个绿色连接器,将其拖到脚本任务中,然后双击它。在"值"下拉列表中选择"失败"。显然,我们将需要处理此脚本任务中的实际失败,以仍然正确显示在作业历史记录中。
啊哈,好的,谢谢澄清。由于FTP任务无法返回列出的文件夹,因此无法使用ForEach,正如我最初所说的那样,这仅在将X数量的文件上传到远程源时才有效。
要下载X数量的文件,我们可以采取两种方式,或者可以完全在.Net脚本任务中完成此操作,或者可以使用.Net脚本任务中的文件名填充ArrayList,然后通过ArrayList进行ForEach ,将文件名传递给变量,然后在标准FTP任务中下载该变量名。
适合的代码示例:http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2472491&SiteID=1
因此,在上面,我们将获取FileNames()并从中填充ArrayList,然后将ArrayList分配给Dts.Variables中的Object类型变量,然后使用类似以下代码的ForEach覆盖该Object(ArrayList)变量: ://www.sqlservercentral.com/articles/SSIS/64014/
(我不能接受自己的回答,但这是对我有用的解决方案。)
它可能不是最好的解决方案,但这是可行的。
我使用脚本任务,并且有一堆用于ftp连接信息以及源目录和目标目录的变量。 (因为,我们将更改在其上运行的服务器,并且在配置包中更容易进行更改。)
我即时创建了一个文本文件,并向其中写入ftp命令:
Dim ftpStream As StreamWriter = ftpFile.CreateText() ftpStream.WriteLine(ftpUser) ftpStream.WriteLine(ftpPassword) ftpStream.WriteLine("prompt off") ftpStream.WriteLine("binary") ftpStream.WriteLine("cd " & ftpDestDir) ftpStream.WriteLine("mput " & ftpSourceDir) ftpStream.WriteLine("quit 130") ftpStream.Close()
然后,在给它足够的时间以使其真正关闭之后,我启动一个执行ftp命令的过程:
ftpParameters = "-s:" & ftpParameterLoc & ftpParameterFile & " " & ftpServer proc = System.Diagnostics.Process.Start("ftp", ftpParameters)
然后,在给它更多的时间运行ftp进程之后,我删除了临时ftp文件(其中包含连接信息!)。
如果源目录中不存在文件(变量具有\ drive \ dir \ *。*映射),则没有错误。如果发生其他错误,则任务仍然会失败,如应有的那样。
我是SSIS的新手,这可能是个麻烦。但这暂时有效。我想我要求的是最好的方法,我当然不会声称是这样。
正如我所指出的,我无法知道文件的名称,甚至根本不知道文件的名称。如果他们在那里,我想得到他们。
检查此链接,该链接描述了如何正常处理SSIS程序包中的任务错误。
我遇到了几乎相同的问题,但是检索了文件。我希望当FTP服务器上没有文件时,包不会失败。上面的链接阻止了错误的冒泡并导致程序包失败。我们会认为FailPackageOnError = false应该完成的事情? :-S
希望这也能为我们解决!
我们可以使用eaSkills提供的免费SSIS FTP Task ++。如果一个或者多个文件不存在,它不会引发错误,它支持通配符,并在需要时提供下载和删除的选项。
这是功能页面的链接:
http://www.easkills.com/ssis/ftptask