2014-10-01 48 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