SSIS条件拆分 - 多个条件

时间:2011-12-29 10:33:50

标签: ssis split conditional conditional-statements

我正在尝试检查列中是否有任何更改。我已经尝试过全力以赴:

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当我更改了两列(与这两个条件相关)。例如,所有Taxes和Premium列都已更改。在条件拆分输出“税已更改”条件选择1,000,000行,“高级已更改”选择100行。我知道这对我的情况没有任何影响,因为对我而言,重要的是这些行被选中进行更新,但我只是对这件事如何运作感到困惑。

3 个答案:

答案 0 :(得分:2)

我相信你的逻辑是合理的,但我建议你把所有这些链式条件分成不同的派生列,特别是如果你有1M行流过它。

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

  

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

第二个原因是可维护性。表达式编辑器不仅不友好且不可原谅,因此检查中间值非常具有挑战性。

演示

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

cache connection manager load

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

data flow

您可以看到附加到"位桶的数据查看器"任务,更改后固定的命名列仅在源和查找值之间存在差异时才计算为True。 (对应于0 的行准确为(ISNULL(LookupTaxes) ? 0 : LookupTaxes),将空值强制为零。

data viewer

我是你,在这一点上我会更换" bit bucket"使用条件分割进行转换

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

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

答案 1 :(得分:1)

另一种方法是在条件性拆分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 + ....

条件性分割DFT:识别DFT2的结果是否存在数据变化。

   YesChange   IdentifiedChange > 0

希望这有帮助。

答案 2 :(得分:0)

实际上答案如下

(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)条件会认为税收!= OR条件,如您条件的第一部分。

这样可行。