【问题标题】:SSIS Conditional Split - multiple conditionsSSIS 条件拆分 - 多个条件
【发布时间】:2012-01-29 19:18:56
【问题描述】:

我正在尝试检查是否有任何列已更改。我试过把所有条件都放在:

Taxes != (ISNULL(LookupTaxes) ? 0 : LookupTaxes) || Checksum != (ISNULL(LookupChecksum) ? 0 : LookupChecksum) || FeeIncome != (ISNULL(LookupFeeIncome) ? 0 : LookupFeeIncome) || CommissionReceived != (ISNULL(LookupCommissionReceived) ? 0 : LookupCommissionReceived) || CommissionPaid != (ISNULL(LookupCommissionPaid) ? 0 : LookupCommissionPaid) || Premium != (ISNULL(LookupPremium) ? 0 : LookupPremium)

但这总是返回FALSE,尽管我已经手动更改了税费。如果我把每个条件分开而不是工作,例如:

Taxes != (ISNULL(LookupTaxes) ? 0 : LookupTaxes)

返回TRUE。如果我对每列使用 6 个条件(而不是 1 个)并将结果输出到 Union All 中,这种方法是否可以满足我的需求?我最担心的是行是否会重复。我已经检查过,看起来它们不是,但我想知道为什么当我更改了两列(与这两个条件相关)时,为什么某些条件会选择 X 记录和另一个 Y。例如,所有税和保费列都已更改。在 Conditional Split 输出“Taxes has changed”条件下选取 1,000,000 行,“Premium has changed”选取 100 行。我知道这对我的情况没有任何影响,因为对我来说,获取这些行进行更新很重要,但我只是对这件事的工作原理感到困惑。

【问题讨论】:

    标签: ssis split conditional conditional-statements


    【解决方案1】:

    我相信您的逻辑是合理的,但我建议您将所有链接的条件拆分为单独的派生列,特别是如果您将有 1M 行流过它。

    第一个原因是性能。通过将操作拆分成更小的部分,数据流引擎可以更好地利用并行性。 Investigation: Can different combinations of components affect Dataflow performance?。来自SQL CAT主题的金钱报价

    我们的测试表明,如果您要更改多个列 在使用派生列任务的数据流中,有一个性能 有利于将该转换拆分为多个派生列 任务。在这篇笔记中,我们将展示做许多较小的部分 在多个派生列任务中的工作速度明显快于 在单个派生列中完成更复杂工作中的所有工作 任务。

    第二个原因是可维护性。表达式编辑器不仅不友好且无情,而且还使得检查中间值变得非常具有挑战性。

    演示

    我整理了一个复制包,它使用脚本任务将 N 行发送到数据流中,所有列中的值与行号相同。在第一个数据流中,我在加载到缓存连接管理器时修改了 Checksum 和 Premium 的值(以模拟不同的查找值)。偶数行应将校验和清空,每三行应将 Premium 清空。

    在此数据流中,我使用了您的原始表达式(All in one check)并将其拆分为每个条件的检查。

    您可以可能通过附加到“位桶”任务的数据查看器看到,更改后固定命名列仅在源值和查找值之间存在差异时评估为 True . (对应于 0 的行是准确的,因为 (ISNULL(LookupTaxes) ? 0 : LookupTaxes) 强制空值为零。

    如果我是你,此时我将用条件拆分替换“位桶”转换

    • 输出名称 = UpdateRequired
    • 条件 = [TaxesChanged] || [ChecksumChanged] || [FeeIncomeChanged]|| [CommissionReceivedChanged] || [CommissionPaidChanged] || [PremiumChanged]

    如果您仍然遇到问题,那么您可以将数据查看器放在管道上以查找未按预期评估的条件。

    【讨论】:

      【解决方案2】:

      另一种方法是在条件拆分 DFT 之前使用 2 派生列数据流转换 (DFT)。

      派生列 DFT 1:检查每个属性,如果数据发生变化,则设置值为 1,如果没有变化,则设置值为 0。例如,检查出生列的入站数据到数据库出生日期列的值。

         DerivedColumn1 =  ((!ISNULL(InDOB) && !ISNULL(DbDOB) && InDOB != DbDOB) || (ISNULL(DbDOB) && !ISNULL(InDOB))) ? 1 : 0
      

      DerivedColumn1 结果是有符号整数值 = 1 或 0。

      DerivedColumn2:对 DFT1 中的派生列值求和。

         IdentifiedChange = DerivedColumn1 + DerivedColumn2 + ....
      

      Conditional Split DFT:确定数据中是否存在由 DFT2 的结果确定的变化。

         YesChange   IdentifiedChange > 0
      

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        其实答案如下

        (Taxes != (ISNULL(LookupTaxes) ? 0 : LookupTaxes)) ||
        (Checksum != (ISNULL(LookupChecksum) ? 0 : LookupChecksum)) ||
        (FeeIncome != (ISNULL(LookupFeeIncome) ? 0 : LookupFeeIncome)) ||
        (CommissionReceived != (ISNULL(LookupCommissionReceived) ? 0 : LookupCommissionReceived)) ||
        (CommissionPaid != (ISNULL(LookupCommissionPaid) ? 0 : LookupCommissionPaid)) ||
        (Premium != (ISNULL(LookupPremium) ? 0 : LookupPremium))
        

        每个变量检查​​的开头和结尾都需要额外的“(”和“)”。 || (OR) 条件会认为 Taxes != OR 条件,就像您的条件的第一部分一样。

        这会起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多