SSIS排除foreach循环中的多个项目

问题描述 投票:2回答:2

我有一个文件系统,其中包含可变数量的文件夹这些文件夹可能包含也可能不包含用于进一步处理的文件我希望排除某些文件夹排除文件夹的列表是逗号分隔的变量分隔变量中包含的排除文件夹的数量可能会更改。例如,当前定界变量为“已处理,已排除,未知”日后,定界变量可能看起来像“已处理,已排除,未知,下载”]

我发现此链接“在Foreach循环中跳过项目”,只要排除的文件夹是硬编码的,它就可以工作https://www.timmitchell.net/post/2009/09/16/skipping-items-in-a-foreach-loop/

例如,优先级约束当前是这样硬编码的:FINDSTRING(@ [User :: FullFileName],“未知”,1)== 0

我的问题是这些:1)将定界字符串拆分为离散值的最佳方法2)根据排除文件夹列表评估foreach变量(在我的示例中为FullFileName)的最佳方法

foreach ssis multivalue exclude
2个回答
1
投票

与Tim的帖子类似的逻辑(我没有安装SSIS,但我确实有BimlStudio,所以请接受SSIS对象的不同图标)。

enter image description here

3个变量

  • CurrentFilename字符串-这将包含当前文件名,该文件名可能包含也可能不包含排除值
  • [ExclusionList字符串-您要排除的文件夹的分隔字符串]
  • [IncludeCurrent boolean-False,我们将在每个循环中覆盖]

在Foreach文件循环中,我将使用脚本任务,因为它将成为拆分ExclusionList和执行文件系统测试的最有效方法。运行脚本任务的结果是我们将@[User::IncludeCurrent]的值设置为true或false。

[脚本任务和数据流任务之间的先行约束逻辑将从参考帖子简化为@[User::IncludeCurrent]

如果满足条件,我们将执行DFT任务。否则,我们将跳过它。

纳入测试

您需要将CurrentFilename和ExclusionList作为只读变量传递到Script任务中。 IncludeCurrent将作为读/写变量传递。

// use the .net native split method to split on commas
var fileList = Dts.Variables["ExclusionList"].Value.Split(new Char[] {','});

// We could inline this for the next operation but you might have need for this elsewhere
string currentFilename = Dts.Variables["CurrentFilename"].Value.ToString();

// https://stackoverflow.com/questions/500925/check-if-a-string-contains-an-element-from-a-list-of-strings
bool isFound = fileList.Any(s=>currentFileName.Contains(s));

// Assign the results back to our SSIS scoped variable
Dts.Variables["IncludeCurrent"].Value = isFound;

关于拉杰·莫尔(Raj More)提议的注释

[SPLIT_STRING假定为SQL Server 2016+。作为一名顾问,我希望我可以指望可用的最新功能,但事实并非如此。

我相信,对于每种循环方法,双重处理可能会遇到的挑战是,在第一遍之后,内部记录集(查询的拆分列表)会被标记为已用尽,因此您需要将此方法修改为FELC所有文件-> OLE DB查询-> FELC过滤器

如果您有比纯字符串匹配更复杂的测试,脚本方法将提供最大的灵活性。


0
投票

我将连接到数据库,执行SPLIT_STRING,将结果放回一个对象,并在每个文件夹名称上使用for-each loop。因此,您将有两个for-each循环,外部的一个用于查找匹配项,和内部的忽略子文件夹。

此外,请记住在SSIS中的字符串比较中要考虑大小写敏感性。

© www.soinside.com 2019 - 2024. All rights reserved.