我正在将数据从旧数据库迁移到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的数据流中进行吗?
下面的可视化(图)和我的流量描述到目前为止。
- 我选择旧的数据库源
[Financial]
- 我转换数据,因此当前数据库中的数据类型相匹配
- 因为我已经迁移的旧
[Financial]
数据库中的数据到新的一个,我可以用查找在新数据库的FinancialID's
上,因此INSERT查询的第一个变量?
可以链接到查找输出。 - 我将所有可能性分开,例如分期付款包含NULL,1,2,3或4时。
- 第五步是我正在寻找的。一些线索,一些有用的东西方向。当NumberOfInstallments为1时,我需要
INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)
,第二个?
变量为1.当NumberOfInstallments为2时,则需要执行两个插入,一个使用InstallmentNumber 1,另一个使用InstallmentNumber 2.当NumberOfInstallmentNumber为3时,则3个插入计数NumberOfInstallmentNumber。当4时,然后4。
有没有什么聪明的方法来实现这个目标?是否有任何我不知道的SSIS的内置函数可用?
我很欣赏这里的任何输入!
谢谢。
编辑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,因为只要我做,我得到以下错误:
任何人都可以解释我为什么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);
这是难看的方法,但用数据的量小我正在使用,也许这不是什么大问题。
这是真的,查询不是真的插入4个人的记录,但只是复制原来的?我需要创建4个插入。我编辑了我的问题来解释我遇到的其他问题。 – 2014-10-02 11:16:39
对不起,我的例子不清楚。请参阅编辑。 – 2014-10-03 15:59:24