基于数组变量的条件分割

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

我需要类似 T-SQL IN 语句的东西来根据数组变量(或类似的东西)过滤条件拆分中的记录

我需要一个可以过滤列的项目列表。

sql-server-2008 ssis comparison
2个回答
4
投票

正如 Filip 所指出的,表达式语言中没有 IN 运算符。我确实提出了一些选择,因为我认为这听起来是一个有趣的问题。

我的长分析在我的博客上:SSIS 中的过滤器列表

有条件分割

如果您可以将值列表转换为分隔字符串,则可以使用

FINDSTRING
和当前值来确定它是否在列表中。这为我的测试场景提供了最佳吞吐量。
(FINDSTRING(@[User::MyListStr], [MyColumn],1)) > 0

脚本任务

我曾假设在脚本任务中使用列表来确定成员资格将提供最佳性能,但我错了。

Row.IsInList = MyListObj.Contains(Row.MyColumn);

查找/缓存连接管理器

我想出的第三种方法是将列表转储到缓存连接管理器中,然后在查找任务中使用它。我认为这是最容易概念化和维护的,但缺乏性能。

结论

对于这个问题域,FINDSTRING 方法是最有效的,效率相当高。其他两种方法的平均吞吐量始终在每毫秒 7 行以内。我确实发现有趣的是 FINDSTRING 方法的标准差波动如此之大。虽然这个盒子较旧且速度较慢,但在包执行期间没有进行大量活动。


0
投票

SSIS 表达式运算符中没有 IN 运算符。并且没有类似的运算符。由于没有这样的运算符,因此您无法使用内置表达式和内置条件拆分来做到这一点。但您可以执行以下操作之一:

    使用脚本转换检查特定列是否在变量数组中,如果包含则添加附加列(标志),值为 1,如果不包含为 0;然后在脚本转换中添加的此标志上使用条件分割,或者
  • 最好将变量放入数据库表中,然后使用 Lookup 或 Merge Join 检查行是否存在
© www.soinside.com 2019 - 2024. All rights reserved.