2014-10-01 88 views
1

我正在将数据从旧数据库迁移到SSIS(2008 R2企业版)中的新数据库。在旧数据库中,我有一个名为[Financial]的表和一个名为:[Installments]的列。此栏中有一个数字值:1,2,3或4.这些是分期付款。旧数据库仅存储此数值,不提供有关各个分期付款的更多信息。但是,新的数据库提供了更多关于每个批次的信息,其中包含以下列:[InstallmentPaid](如果客户支付分期付款),[DateInstallmentPaid](当客户支付分期付款时),[InstallmentNumber](这对于指定它的分期付款编号很重要。客户需要分4次付款,然后创建4条记录,其中1个是InstallmentNr1,其次是InstallmentNr2,第三个是InstallmentNr3,第四个是InstallmentNr4),当然还有[InstallmentPrice]基于记录值的插入操作的SSIS数

因此,旧数据库的表[Financial]与列[Installments]。新的数据库具有相同的[Financial]表,但不是有一个叫[Installments]列,它有一个新的关系称为[CustInstallments][CustInstallments]FK FinancialID(1对多的关系)

所以现在我正在迁移数据从旧数据库到新的一个,我不想失去约分期付款额的信息下面的逻辑应该在SSIS为了防止信息丢失执行:

Foreach [Installments] in [Financial] from the old database, insert a new [CustInstallment] referencing to the corresponding [FinancialID] within the new database

所以,如果在旧数据库[分期付款]中的数值是3,那么我需要INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)? sh第一次插入时应为1,第二次为2,第三次为3。所以我需要一些循环?这甚至可以在SSIS的数据流中进行吗?

下面的可视化(图)和我的流量描述到目前为止。

  1. 我选择旧的数据库源[Financial]
  2. 我转换数据,因此当前数据库中的数据类型相匹配
  3. 因为我已经迁移的旧[Financial]数据库中的数据到新的一个,我可以用查找在新数据库的FinancialID's上,因此INSERT查询的第一个变量?可以链接到查找输出。
  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。

有没有什么聪明的方法来实现这个目标?是否有任何我不知道的SSIS的内置函数可用?

我很欣赏这里的任何输入!

谢谢。

enter image description here

编辑2014年10月2日

我曾尝试下面的代码:

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 

但此查询不创建的记录X-量,相反, JOIN nums只是将其复制X次,所以我仍然无法单独跟踪每个安装。

我写我自己的代码 - 土气了我一段时间,因为我从来没有与TSQL的工作 - 这就像在SQL Server中的魅力:

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 

现在在SSIS中,我无法改变#ID到? -variable,并使用查找FinancialID,因为只要我做,我得到以下错误:

enter image description here

任何人都可以解释我为什么SSIS不也是这样吗?

编辑2014年10月2日

我最后和最可取的选择是使用多播投次插入查询X量,其中各X是一个OLE DB命令。例如,当有3 [分期付款]在旧列,我想创建与3级OLE DB的命令的多播,与他们的SqlCommand

OLE DB Command 1: INSERT INTO CustInstallments (FinancialID, InstallmentNumber) values (?, 1); 

OLE DB Command 2: INSERT INTO CustInstallments (FinancialID, InstallmentNumber) values (?, 2); 

OLE DB Command 3: INSERT INTO CustInstallments (FinancialID, InstallmentNumber) values (?, 3); 

这是难看的方法,但用数据的量小我正在使用,也许这不是什么大问题。

enter image description here

回答

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 

因此,对于每个financialid,您将获得多个投资与不同的投资id。这是一种基于集合的方式来处理操作,这将比程序方法更好地执行,并且在ssis中需要更少的努力。这是否更有意义?

+0

这是真的,查询不是真的插入4个人的记录,但只是复制原来的?我需要创建4个插入。我编辑了我的问题来解释我遇到的其他问题。 – 2014-10-02 11:16:39

+0

对不起,我的例子不清楚。请参阅编辑。 – 2014-10-03 15:59:24