这是实现这一目标的一种方法。您可以使用Expression Task
组合 withForeach Loop Container
来匹配文件名的数值。这是一个说明如何执行此操作的示例。该示例使用SSIS 2012
.
这可能不是很有效,但它是这样做的一种方式。
假设有一个文件夹,其中包含以 YYYYMMDD 格式命名的文件。该文件夹包含自 1921 年以来每个月的第一天的文件,例如19210101、19210201、19210301 .... 直到当前月份的所有20121101。这增加了1,103
文件。
假设要求仅遍历自 1948 年 6 月以来创建的文件。这意味着 SSIS 包必须仅遍历大于19480601
.

在 SSIS 包上,创建以下三个参数。最好为这些配置参数,因为这些值可以跨环境配置。
ExtensionToMatch
- 这个String
数据类型的参数将包含包必须循环的扩展。这将补充FileSpec
将在 Foreach 循环容器上使用的变量的值。
FolderToEnumerate
- 此String
数据类型参数将存储包含要循环遍历的文件的文件夹路径。
MinIndexId
- 此Int32
数据类型参数将包含文件应与模式匹配的最小数值。

创建以下四个参数来帮助我们遍历文件。
ActiveFilePath
- 这个数据类型的变量String
将保存文件名,因为 Foreach 循环容器循环遍历文件夹中的每个文件。此变量用于另一个变量的表达式。为避免错误,请将其设置为非空值,例如 1。
FileCount
- 这是一个Int32
数据类型的虚拟变量,将用于此示例以说明 Foreach 循环容器将循环通过的文件数。
FileSpec
- 这个数据类型的变量String
将保存要循环的文件模式。将此变量的表达式设置为下面提到的值。此表达式将使用参数上指定的扩展名。如果没有扩展名,它将*.*
遍历所有文件。
"*" + (@[$Package::ExtensionToMatch] == "" ? ".*" : @[$Package::ExtensionToMatch])
ProcessThisFile
- 此数据类型变量Boolean
将评估特定文件是否符合条件。

如下所示配置包。Foreach 循环容器将遍历与FileSpec
变量指定的模式匹配的所有文件。表达式任务上指定的表达式将在运行时进行计算,并将填充变量 ProcessThisFile。然后,该变量将用于 Precedence 约束以确定是否处理文件。
FileCount
Foreach 循环容器中的脚本任务将为每个成功匹配表达式的文件将变量的计数器增加1。
Foreach 循环外的脚本任务将简单地显示 Foreach 循环容器循环了多少文件。

配置 Foreach 循环容器以循环使用参数的文件夹和使用变量的文件。

ActiveFilePath
当循环通过每个文件时,将文件名存储在变量中。

在表达式任务中,将表达式设置为以下值。该表达式会将不带扩展名的文件名转换为数字,然后检查其计算结果是否大于参数中的给定数字MinIndexId
@[User::ProcessThisFile] = (DT_BOOL)((DT_I4)(REPLACE(@[User::ActiveFilePath], @[User::FileSpec] ,"")) > @[$Package::MinIndexId] ? 1: 0)

右键单击 Precedence 约束并将其配置为使用ProcessThisFile
表达式上的变量。这告诉包仅在文件与表达式任务上设置的条件匹配时才处理文件。
@[用户::ProcessThisFile]

在第一个脚本任务中,我将变量User::FileCount
设置为ReadWriteVariables和脚本任务中的以下 C# 代码。这会增加成功匹配条件的文件的计数器。
public void Main()
{
Dts.Variables["User::FileCount"].Value = Convert.ToInt32(Dts.Variables["User::FileCount"].Value) + 1;
Dts.TaskResult = (int)ScriptResults.Success;
}
在第二个脚本任务中,我将变量User::FileCount
设置为ReadOnlyVariables和脚本任务中的以下 C# 代码。这只是输出已处理的文件总数。
public void Main()
{
MessageBox.Show(String.Format("Total files looped through: {0}", Dts.Variables["User::FileCount"].Value));
Dts.TaskResult = (int)ScriptResults.Success;
}
当 MinIndexId 设置为1948061
(不包括 this)执行包时,它输出 value 773
。

当 MinIndexId 设置为20111201
(不包括 this)执行包时,它输出 value 11
。
希望有帮助。
