需要将SSIS变量传递给执行进程任务,以便为Winscp生成动态命令行参数
我在SFTP位置有一个文件夹需要将SSIS变量传递给执行进程任务,以便为Winscp生成动态命令行参数,ssis,sftp,winscp,Ssis,Sftp,Winscp,我在SFTP位置有一个文件夹'DATA',我需要从那里将文件集下载到某个公共位置,然后将相应的文件复制到不同的文件夹位置 文件名为: Test1.csv Test2.csv Test3.csv Test4.csv Test5.csv 我希望文件首先下载到以下位置: G:\USER_DATA\USER_USER_SYNC\Download 因为这些文件与不同的模式相关,并且必须由每个不同的ssis包分别处理,以便进行进一步的转换和加载。 出于某些原因,我们必须先将其保存在某个公共位置,然后再移
'DATA'
,我需要从那里将文件集下载到某个公共位置,然后将相应的文件复制到不同的文件夹位置
文件名为:
Test1.csv
Test2.csv
Test3.csv
Test4.csv
Test5.csv
我希望文件首先下载到以下位置:
G:\USER_DATA\USER_USER_SYNC\Download
因为这些文件与不同的模式相关,并且必须由每个不同的ssis包分别处理,以便进行进一步的转换和加载。
出于某些原因,我们必须先将其保存在某个公共位置,然后再移动或复制。
这是我的命令行参数
/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://username:password@stransfer.host.com/" -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "get /DATA/Test1.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"
使用上面的方法,我可以一次下载一个给定的文件
因为,我需要将它放在某个公用文件夹位置。因此,我计划添加另一个执行流程任务来复制文件
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing2
等等
我正在寻找一种方法,通过这种方法,我们可以将所有可用文件下载到某个公共文件夹位置,然后移动或复制到不同的文件夹位置。我改变了设计,并采用了一种新方法。感谢Martin解决sftp相关问题并提供持续支持 新SSIS包具有以下任务: 步骤1。它将在sftp服务器上查找最新更新的文件,并将给定文件
Test1.csv
和Test2.csv
下载到位置G:\USER\u DATA\USER\u USER\u SYNC\download\
以下是我的命令行参数:
/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://bisftp:*UFVy2u6jnJ]#hU0Zer5AjvDU4#K3m@stransfer.host.com/ -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "cd /DATA" "get -filemask=">=today" Test1.csv Test2.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"
第2步。因为我的要求是将每个文件进一步复制到不同的文件夹位置,以便各个进程可以选择相应的文件并开始转换并将其加载到sql server
此步骤将执行Window cmd进程,并将Test1.csv
复制到新位置,如下所示
G:\USER_DATA\USER_USER_SYNC\Testing1
G:\USER_DATA\USER_USER_SYNC\Testing2
命令行参数如下所示:
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test2.csv G:\USER_DATA\USER_USER_SYNC\Testing2
像wise一样,我还有另一个执行流程任务要将Test2.csv
复制到新位置,如下所示:
G:\USER_DATA\USER_USER_SYNC\Testing1
G:\USER_DATA\USER_USER_SYNC\Testing2
命令行参数如下所示:
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1
/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test2.csv G:\USER_DATA\USER_USER_SYNC\Testing2
给定的解决方案运行良好,但仍有一些事情需要处理
由于我仅使用-filemask=“>=today”下载最新文件。
如果执行进程任务能够在sftp服务器上找到最新文件,则一切运行正常。如果不存在,则下一个后续执行流程任务将失败,并显示以下错误消息。
返回的进程退出代码为“1”,而预期的为“0”
这里我理解的是,它失败了,因为它没有任何东西可以复制或移动。
是否有任何方法可以捕获第一个执行流程任务返回的退出代码并将其存储到某个变量中,以便我们可以使用表达式来决定是否启动下一个任务
其次,正如您所看到的,我使用两个执行进程任务将文件从一个位置复制到另一个位置。我们可以做些什么来将这两个命令组合成一个执行过程任务吗
任何建议都是非常受欢迎的,而且我认为这个问题需要作为一个单独的问题来解决。这个问题怎么样尽管一种更有效的方法是将所有文件放在一个命令行中。否则,您将为每个文件打开一个新连接。看起来您真的很接近了。只需在“执行进程”任务的“Arguments”属性上设置一个表达式。“我们如何使用更高的选项进行处理。要将所有文件放在一个命令行中”-您需要执行类似于
“cd/DATA”的操作获取Test1.csv Test2.csv Test3.csv…G:\USER\u DATA\USER\u USER\u SYNC\“
。您需要从文件名列表中生成Test1.csv Test2.csv Test3.csv
。这可能很容易,但我不知道如何在SSIS中做到这一点。您可能想问一个更具体的问题。如果您需要不同的位置,只需重复get
命令,例如:“get Test1.csv G:\USER\u DATA\USER\u USER\u SYNC\Download1\”get Test2.csv G:\USER\u DATA\USER\u USER\u SYNC\Download2\”
好吧,好吧,但您实际上没有对原始问题的答案。也许你可以用你的答案有意义的方式编辑这个问题。@Martin Prikryl。。我同意。我将编辑这个问题。我的方法是不正确的,循环文件名,然后为此建立单独的sftp连接。我喜欢你的方法,它效率更高,速度更快。这改变了问答的整个背景。:-)我将提出另一个问题,讨论与文件处理有关的进一步问题。再次非常感谢。