首页 > 解决方案 > SSIS在移动时将日期添加到文件名

问题描述

我在一个文件位置有一个 csv,我试图将它移动并重命名到另一个位置。

目前我有一个带有文件系统任务的 for 循环。

For 循环在以下位置查找所有 csv 文件@ProcessingFilePath

我将名称和扩展名写入一个名为@ProcessedFileName.

我还有另一个名为 的变量@ArchiveFilePath,这是我要移动文件的地方。

所以我有一个文件连接管理器,其表达式为

@ProcessingFilePath + "\\" + @ProcessedFileName

然后在文件系统任务中——源连接将是上面的文件连接管理器。

我正在尝试创建另一个变量的目的地,类似于@ArchiveFilePathandName,我有以下表达式(我从另一个站点捏造)。

@[User::ArchiveFilePath] 
+ SUBSTRING( @[User::ProcessedFileName] , 1 , FINDSTRING( @[User::ProcessedFileName],".",1) - 1 ) 
+ "-" + (DT_STR, 2, 1252) Month( @[System::StartTime] )
+ (DT_STR, 4, 1252) Year( @[System::StartTime] )
+ SUBSTRING( @[User::ProcessedFileName] , FINDSTRING( @[User::ProcessedFileName],".",1) , LEN( @[User::ProcessedFileName] ) ) 

但我收到一条错误消息:

长度 -1 对函数 SUBSTRING 无效。长度参数不能为负数。将长度参数更改为零或正值。

我不知道在这里做什么。有没有更好的方法来解决这个问题?

标签: ssis

解决方案


问题是您的文件名称中没有点。该FINDSTRING函数返回-1,随后SUBSTRING失败,因为它不能从-1开始。

一个解决方案是预先检查文件是否有一个点以完全防止SUBSTRING。您可以使用三元运算符来做到这一点? :

FINDSTRING(@[User::ProcessedFileName],".",1) > 0 ?

    @[User::ArchiveFilePath] 
    + SUBSTRING( @[User::ProcessedFileName] , 1 , FINDSTRING( @[User::ProcessedFileName],".",1) - 1 ) 
    + "-" + (DT_STR, 2, 1252) Month( @[System::StartTime] ) + (DT_STR, 4, 1252) Year( @[System::StartTime] )
    + SUBSTRING( @[User::ProcessedFileName] , FINDSTRING( @[User::ProcessedFileName],".",1) , LEN( @[User::ProcessedFileName] ) ) 

    :

    @[User::ArchiveFilePath] 
    + @[User::ProcessedFileName]
    + "-" + (DT_STR, 2, 1252) Month( @[System::StartTime] ) + (DT_STR, 4, 1252) Year( @[System::StartTime] )

表达式确实是 SSIS 的一个弱点,这是一个很好的例子。


推荐阅读