【问题标题】:How to split source table records is SSIS如何拆分源表记录是SSIS
【发布时间】:2018-03-08 14:11:53
【问题描述】:

下面给出了带有数据的源表和目标表结构。源表具有事务类型列,将基于此列定义目标表行。假设:源表数据是

在第一行 SalesTranId=1 和 TranType=monthly,因为这是一个每月交易目标表,将填充 30 行,值为 500/30=16.6,如下所示

当 Source TranType=Yearly 时,目标表必须基于源表行有 365 行。 如何在 SSIS 包中做到这一点。

源表:

目标表:

SSIS 包:

【问题讨论】:

  • 这种事情在数据库中比较容易做,有日历表。 (这也将正确地给你一年 365 或 366 天等)
  • @ Nick.McDermaid,这是一个 ETL 项目,需要运行批处理,然后源数据将被处理/拆分并填充目标表。请您详细描述一下,我们如何做到这一点?
  • 我建议您先对日历表进行一些研究。您可以通过与日历表中的 30 行交叉连接来将一行变成 30 行。在这一点上,我不打算详细介绍。首先将您的数据加载到临时表中并调查日历表

标签: sql-server ssis etl sql-server-data-tools


【解决方案1】:

我同意 Tab 和 Nick 的观点,但你坚持要在 SSIS 中这样做。

你必须做出一些假设才能使我的逻辑起作用:

每月转换为 30,每季度转换为 90,每年转换为 365。

  1. 导入您的来源。

  2. 添加一个脚本组件并创建一个与您的目标类似的第二个输出。

  3. 添加以下代码:
//Determine Divisor
int DIV = 0;

switch(Row.TranType.ToLower())
{
    case "monthly":
       DIV=30;
       break;
    case "quarterly":
       DIV=90;
       break;
    case "yearly":
       DIV=365;
       break;
}

for (int i = 1; i<=DIV;i++)
{
   destBuffer.AddRow();
   destBuffer.SalesTranID = Row.SalesTransID;
   destBuffer.TranType = Row.TranType;
   destBuffer.TranAmt = Row.TranAmt/DIV;
}

【讨论】:

    【解决方案2】:

    如果您必须在数据流中执行此操作,则需要使用脚本组件。

    就我个人而言,我会将数据按原样发送到临时表,并在将数据从临时表移动到最终目标表时在存储过程中进行拆分。它会执行得更快。

    【讨论】:

    • 源表信息扁平,因为事务信息复杂,需要与其他表连接处理,然后需要拆分数据放入目标表。请您定义您的流程步骤。
    • 哪个过程,哪一部分你不明白?
    • 最初目标表为空,基于源表TRAN-TYPE列目标表记录被拆分。假设现在目标表有超过一百万条记录,其余信息需要从模糊记录中填充,因此目标表一百万条记录需要使用新信息进行更新。
    • 你原来的问题没有提到任何这些。我认为您需要使用一些图形或代码将其添加到您的问题中以解释您的意思。您上面的评论太难以理解了。
    • 您仔细阅读了我的 cmets 感谢您的宝贵努力,我现在做什么?建议我更好的方法以获得最佳性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多