2009-02-13 75 views
0

我有一些SQL执行这样的成本中心GL帐户号码的组合和复杂的逻辑:SSIS/VB.NET当量(匿名array.Contains())

WHEN (@IntGLAcct In (
    882001, 882025, 83000154, 83000155, 83000120, 83000130, 
    83000140, 83000157, 83000010, 83000159, 83000160, 83000161, 
83000162, 83000011, 83000166, 83000168, 83000169, 82504000, 
82504003, 82504005, 82504008, 82504029, 82530003, 82530004, 
83000000, 83000100, 83000101, 83000102, 83000103, 83000104, 
83000105, 83000106, 83000107, 83000108, 83000109, 83000110, 
83000111, 83000112, 83000113, 83100005, 83100010, 83100015, 
82518001, 82552004, 884424, 82550072, 82552000, 82552001, 
82552002, 82552003, 82552005, 82552012, 82552015, 884433, 
884450, 884501, 82504025, 82508010, 82508011, 82508012, 
83016003, 82552014, 81000021, 80002222, 82506001, 82506005, 
82532001, 82550000, 82500009, 82532000)) 

总体,整个事情在UDF中表现不佳,特别是当它全部嵌套并且步骤的顺序很重要时等等。我还不能使它成为表驱动,因为业务逻辑非常复杂。

所以我做的那些迁移到SSIS看到关于不同的方式一点点做,一点点探索性工作。在我的脚本任务,不过,我得使用VB.NET,所以我正在寻找替代本:

Select Case IntGLAcct = 882001 OR IntGLAcct = 882025 OR ... 

这显然是很多更详细的,并将使非常难移植过程。

即使像({90605, 90607, 90610} AS List(Of Integer)).Contains(IntGLAcct)会更容易端口,但我不能得到初始给我一个匿名数组这样。这些小集合有很多,我不确定我可以提前创建它们。

这一切都是需要在一个地方。企业经常改变这个逻辑。我的策略是使用udf来镜像他们旧的“包含”文件,但性能一直很差。现在每个功能只需要2或3个参数。事实证明,在现有系统的一个黑暗角落里,他们实际上构建了一个包含所有这些结果的数百万行表格 - 即使预先制定的表格使用得并不多。所以我的新实验是(因为我仍在构建大规模的交叉连接表来协调这部分流程)继续,并使用表而不是代码,但继续并在SSIS阶段,而不是调用UDF 1200万次 - 因为我的udf版本基本上在合理的时间内停止工作,而DBA现在没有太多帮助。然而,我知道SSIS可以非常有效地处理这些行 - 因为每个月我都会在几分钟内从遗留系统中获得数十万数百万的行表,并运行查询来协调与新版本没有区别。

的SSIS代码将理论上成为业务逻辑的管理器中,以及有效表将来自构建(基于所有已知参数组合)。当然,如果我可以将逻辑简化到一个真正的逻辑表,那将是最终的设计 - 但在这一点上这是不可预见的。

回答

1

试试这个:

Array.IndexOf(New Integer() {90605, 90607, 90610}, IntGLAcct) >-1 
0

,如果你使用的是什么您输入的数据设置条件分裂变换,然后使用表达式或类似的东西(我不知道,如果你的总帐科目是固定的,或者如果你要动态传递他们)申请到结果?然后您可以根据需要从中获取所得数据并进行处理。

+0

我知道你来自哪里,但这些UDF的一个是600线,30条CASE语句,另一个是1000线。我们已经每个月都要将它们重新同步到原始的Focus包含文件,以确保我们的结果是准确的,直到旧系统被替换。 – 2009-02-13 21:24:57

+0

呃,是的。这将是非常讨厌的。我在其他评论中看到,动态数组生成工作正常,所以Woo Hoo就是这样的! – 2009-02-13 21:44:56