下面给出了具有数据的源表和目标表结构 . 源表有事务类型列,基于此列的目标表行将被定义 . 假设:源表数据是
在第一行SalesTranId = 1和TranType =每月,因为这是一个月度事务目标表将填充30行,值为500/30 = 16.6,如下所示
Source TranType = Yearly时,目标表必须具有基于源表行的365行 . 如何在SSIS包中做到这一点 .
Source Table:
Target table:
SSIS package:
我同意Tab和Nick的观点,但你坚持在SSIS中这样做 .
你必须做一些假设才能让我的逻辑工作:
每月翻译为30,每季度翻译为90,每年翻译为365 .
导入您的来源 .
添加脚本组件并创建目标的第二个输出 .
添加以下代码:
//确定除数int DIV = 0;
开关(Row.TranType.ToLower()){案例“每月”:DIV = 30;打破;案例“季刊”:DIV = 90;打破;案例“年度”:DIV = 365;打破;}
for(int i = 1; i <= DIV; i){destBuffer.AddRow();destBuffer.SalesTranID = Row.SalesTransID;destBuffer.TranType = Row.TranType;destBuffer.TranAmt = Row.TranAmt / DIV;}
如果必须在数据流中执行此操作,则需要使用脚本组件 .
我个人会按原样将数据发送到临时表,并在将存储过程从登台表移动到最终目标表时进行拆分 . 它会表现得更快 .
2 回答
我同意Tab和Nick的观点,但你坚持在SSIS中这样做 .
你必须做一些假设才能让我的逻辑工作:
每月翻译为30,每季度翻译为90,每年翻译为365 .
导入您的来源 .
添加脚本组件并创建目标的第二个输出 .
添加以下代码:
开关(Row.TranType.ToLower())
{
案例“每月”:
DIV = 30;
打破;
案例“季刊”:
DIV = 90;
打破;
案例“年度”:
DIV = 365;
打破;
}
for(int i = 1; i <= DIV; i)
{
destBuffer.AddRow();
destBuffer.SalesTranID = Row.SalesTransID;
destBuffer.TranType = Row.TranType;
destBuffer.TranAmt = Row.TranAmt / DIV;
}
如果必须在数据流中执行此操作,则需要使用脚本组件 .
我个人会按原样将数据发送到临时表,并在将存储过程从登台表移动到最终目标表时进行拆分 . 它会表现得更快 .