我正在将数据从旧数据库迁移到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 FinancialID
此INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)
在第一次插入时应为1,在第二次插入时为2和3 3。所以我需要一种循环吗?这在SSIS的数据流中是否可能?
到目前为止,我的流程可视化(图)和描述。
?
[Financial]
数据库数据迁移到新数据库,因此我可以在新数据库的[Financial]
上使用查找,因此INSERT的第一个变量FinancialID's
查询可以链接到查找输出。?
,第二个INSERT INTO CustInstallments (FinancialID, InstallmentNumber) VALUES (?, ?)
变量为1.当NumberOfInstallments为2时,我需要进行两次插入,一次使用InstallmentNumber 1,另一次使用InstallmentNumber 2。当NumberOfInstallmentNumber为3时,则插入3个计数NumberOfInstallmentNumber。当4,然后是4。 有没有聪明的方法来实现这一目标?是否有任何我不知道的SSIS内置功能,可以在这里使用?
我感谢此处的任何输入!
谢谢。
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,因为我一旦得到以下错误:
有人能解释我为什么SSIS不喜欢这个吗?
EDIT 10/02/2014
我的最后一个也是最不可取的选择是使用多播来插入插入查询X次,其中每个X都是OLE DB命令。例如,当旧列中有3个[分期付款]时,我将创建一个包含3个OLE DB命令的多播,其?
:
SqlCommand
这是一种丑陋的方法,但由于我使用的数据量很少,也许这不是什么大问题。
答案 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的多项投资。这是一种基于集合的方式来处理操作,它将比程序方法执行得更好,并且需要更少的工作量。那更有意义吗?