SSIS基于记录值的插入操作量

时间:2014-10-01 14:34:38

标签: ssis migration data-migration

我正在将数据从旧数据库迁移到SSIS(2008 R2 Enterprise Edition)中的新数据库。在旧数据库中,我有一个名为[Financial]的表和一个名为[Installments]的列。此列中包含数值:1,2,3或4.这些是分期付款。旧数据库仅存储此数字值,并且不提供有关各个分期付款的任何其他信息。但是,新数据库提供了每个分期付款的更多信息,其中包括:[InstallmentPaid](如果客户支付分期付款),[DateInstallmentPaid](当客户支付分期付款时),[InstallmentNumber] (这对于指定它的安装数量很重要。如果客户想要分4次付款,那么将创建4条记录.1条带有InstallmentNr1,第二条带有InstallmentNr2,第三条带有InstallmentNr3,第四条带有InstallmentNr4。)当然{ {1}}。

因此旧数据库的表[InstallmentPrice]包含[Financial]列。新数据库具有相同的[Installments]表,但它没有名为[Financial]的列,而是有一个名为[Installments]的新关系([CustInstallments]具有[CustInstallments]( 1对多的关系)

现在,我正在将数据从旧数据库迁移到新数据库,我不想丢失有关分期付款数量的信息。应在SSIS中执行以下逻辑以防止信息丢失:

  

来自旧数据库的[财务]中的Foreach [分期付款],插入一个   新的[CustInstallment]引用相应的[FinancialID]   在新数据库中

因此,如果在旧数据库中[Installments]中的数值为3,那么我需要FK FinancialIDINSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)在第一次插入时应为1,在第二次插入时为2和3 3。所以我需要一种循环吗?这在SSIS的数据流中是否可能?

到目前为止,我的流程可视化(图)和描述。

  1. 我选择旧的数据库来源?
  2. 我转换数据以使其与当前数据库数据类型匹配
  3. 由于我已经将旧的[Financial]数据库数据迁移到新数据库,因此我可以在新数据库的[Financial]上使用查找,因此INSERT的第一个变量FinancialID's查询可以链接到查找输出。
  4. 我分割了所有可能性,例如当分期付款包含NULL,1,2,3或4时。
  5. 第五步是我正在寻找的。一些线索,一些有用的方向。当NumberOfInstallments为1时,我需要?,第二个INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)变量为1.当NumberOfInstallments为2时,我需要进行两次插入,一次使用InstallmentNumber 1,另一次使用InstallmentNumber 2。当NumberOfInstallmentNumber为3时,则插入3个计数NumberOfInstallmentNumber。当4,然后是4。
  6. 有没有聪明的方法来实现这一目标?是否有任何我不知道的SSIS内置功能,可以在这里使用?

    我感谢此处的任何输入!

    谢谢。

    enter image description here

    EDIT 10/02/2014

    我尝试过以下代码:

    ?

    但是这个查询不会创建X数量的记录,相反,JOIN nums只会复制X次,所以我仍然无法单独跟踪每个分期。

    我编写了自己的代码 - 请问我一段时间,因为我以前从未使用过TSQL - 这就像SQL Server中的魅力一样:

     INSERT INTO CustInstallments (FinancialID, InstallmentNumber) values (?, X);
     WITH nums AS(select top 4 row_number() over (order by (select 1)) AS id
                     from sys.columns
                   ) SELECT f.* FROM CustInstallments f
      JOIN nums n on f.InstallmentNumber>= n.id
    

    现在在SSIS中,我无法将#ID更改为DECLARE @MyCounter tinyint; SET @MyCounter = 1; WHILE (SELECT COUNT(*) FROM CustInstallments WHERE FinancialID = #ID) < 4 BEGIN INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (#ID, @MyCounter) IF (SELECT COUNT(*) FROM CustInstallments) > 4 BREAK ELSE SET @MyCounter = @MyCounter +1; CONTINUE END - 变量,并使用查找FinancialID,因为我一旦得到以下错误:

    enter image description here

    有人能解释我为什么SSIS不喜欢这个吗?

    EDIT 10/02/2014

    我的最后一个也是最不可取的选择是使用多播来插入插入查询X次,其中每个X都是OLE DB命令。例如,当旧列中有3个[分期付款]时,我将创建一个包含3个OLE DB命令的多播,其?

    SqlCommand

    这是一种丑陋的方法,但由于我使用的数据量很少,也许这不是什么大问题。

    enter image description here

1 个答案:

答案 0 :(得分:0)

我会尝试在源查询中使用TSQL解决此问题。像这样加入某种数字表:

create table #fininancial (id int not null identity(1,1), investments int);
go

insert into #fininancial (investments) values (1),(2);
GO

with nums as (select top 5 row_number() over (order by (select 1)) as id
                from sys.columns
                )


select f.* from #fininancial f
    JOIN nums n on f.investments >= n.id

修改 上面的例子不清楚 - 抱歉。我只是提出了复制行的概念,但没有完成对如何应用它的想法。试试这个:

create table #fininancial (financialid int not null, investments int);
go

insert into #fininancial (financialid, investments) values (123, 1),(456, 2);
GO

with nums as (select top 5 row_number() over (order by (select 1)) as id
                from sys.columns
                )


select f.financialid, n.id as investments from #fininancial f
    JOIN nums n on n.id <= f.investments 

因此,对于每个财务人员,您将获得具有不同投资ID的多项投资。这是一种基于集合的方式来处理操作,它将比程序方法执行得更好,并且需要更少的工作量。那更有意义吗?