这是实现这一目标的一种方法。您可以使用Expression Task 结合Foreach Loop Container 来匹配文件名的数值。这是一个说明如何执行此操作的示例。该示例使用SSIS 2012。
这可能不是很有效,但它是这样做的一种方式。
假设有一个文件夹,其中包含以 YYYYMMDD 格式命名的文件。该文件夹包含自 1921 年以来每个月的第一天的文件,例如 19210101、19210201、19210301 .... 到当前月份的所有文件 20121101。这增加了1,103 个文件。
假设要求仅遍历自 1948 年 6 月以来创建的文件。这意味着 SSIS 包必须仅遍历大于 19480601 的文件。
在 SSIS 包上,创建以下三个参数。最好为这些配置参数,因为这些值可以跨环境配置。
ExtensionToMatch - String 数据类型的此参数将包含包必须循环的扩展。这将补充将在 Foreach 循环容器上使用的 FileSpec 变量的值。
FolderToEnumerate - String 数据类型的此参数将存储包含要循环遍历的文件的文件夹路径。
MinIndexId - Int32 数据类型的此参数将包含文件应与模式匹配的最小数值。
创建以下四个参数来帮助我们遍历文件。
ActiveFilePath - 这个String 数据类型的变量将保存文件名,因为 Foreach 循环容器循环遍历文件夹中的每个文件。此变量用于另一个变量的表达式。为避免错误,请将其设置为非空值,例如 1。
FileCount - 这是一个 Int32 数据类型的虚拟变量,将用于此示例以说明 Foreach 循环容器将循环通过的文件数。
FileSpec - 这个String 数据类型的变量将保存要循环的文件模式。将此变量的表达式设置为下面提到的值。此表达式将使用参数上指定的扩展名。如果没有扩展,它会*.* 循环遍历所有文件。
"*" + (@[$Package::ExtensionToMatch] == "" ? ".*" : @[$Package::ExtensionToMatch])
-
ProcessThisFile - 这个Boolean 数据类型的变量将评估特定文件是否符合条件。
如下图配置包。 Foreach 循环容器将遍历与FileSpec 变量中指定的模式匹配的所有文件。表达式任务上指定的表达式将在运行时进行计算,并将填充变量 ProcessThisFile。然后该变量将用于 Precedence 约束以确定是否处理文件。
对于每个成功匹配表达式的文件,Foreach 循环容器中的脚本任务会将变量 FileCount 的计数器加 1。
Foreach 循环外的脚本任务将简单地显示 Foreach 循环容器循环了多少文件。
配置 Foreach 循环容器以循环使用参数的文件夹和使用变量的文件。
在循环遍历每个文件时将文件名存储在变量ActiveFilePath 中。
在表达式任务中,将表达式设置为以下值。该表达式会将不带扩展名的文件名转换为数字,然后检查其计算结果是否大于参数MinIndexId中的给定数字
@[User::ProcessThisFile] = (DT_BOOL)((DT_I4)(REPLACE(@[User::ActiveFilePath], @[User::FileSpec] ,"")) > @[$Package::MinIndexId] ? 1:0)
右键单击优先约束并将其配置为在表达式上使用变量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(不包括这个)执行包时,输出值773。
当MinIndexId设置为20111201(不包括这个)执行包时,它输出值11。
希望对您有所帮助。