2017-07-25 52 views
1

我需要創建一個SSIS項目,每天將150個文件批量加載到SQL Server數據庫中。每個批次總是包含相同的150個文件,批次中的每個文件都有唯一的名稱。每個文件也可以是完整或增量類型。增量文件比完整文件多一列。每個批次都包含一個控制文件,用於說明文件是已滿還是已增量。見下面的例子一個文件:使用動態生成的列加載文件

完整文件

| SID | Name | DateOfBirth | 
|:---: | :----: | :-----------: | 
| 1 | Samuel | 20/05/1964 | 
| 2 | Dave | 06/03/1986 | 
| 3 | John | 15/09/2001 | 

增量文件

| SID | Name | DateOfBirth | DeleteRow | 
|:---: | :----: | :-----------: | :----------: | 
| 2 |  |    | 1   |  
| 4 | Abil | 19/11/1993 | 0   | 
| 5 | Zainab | 26/02/2006 | 0   | 

我想,以避免造成2包(完全和增量),每個文件。

有沒有一種方法可以根據控制文件中的文件類型動態生成每個源/目標組件中的列列表?例如,當文件類型是增量式時,列列表應包含額外列(DeleteRow)。

+0

老實說,我搜查,甚至嘗試自己。我無法輕鬆做到這一點。如果您可以將源修改爲具有相同數量的列,那將會更好。 ETL是爲了做靜態工作。如果將來發現任何問題,請立即發佈解決方案。 –

+0

謝謝。我會分享我找到的任何解決方案。 – MayowaO

+0

查看我發佈的答案。如果需要,請詢問更多細節。儘管它很直。 –

回答

1

假設我ControlFile.xlsx是:

Col1  Col2 
File1.xlsx Full 
file2.xlsx Incremental 

流量

1.創建其中ControlFile.xlsx在一個對象變量拍攝的DFT。 Source : Control connection, Destination : RecordSet Destination

  1. 將此對象變量傳遞給ForEach loop。 ResultSet變量應該捕獲ControlFile.xlsx的Col2。

  2. 僅爲起點創建一個Sequence容器。爲滿負荷和增量負荷添加2 DFD。使用約束(如下圖所示 圖片)來決定運行哪個DFD。

  3. 在DFD內部,使用excel來源到OLEDB目的地。

  4. 使用FilePath變量獲取滿負荷和增量式Excel連接中的連接屬性以使其變爲動態。

第一步:整體形象

img_main

第二步: 在DFT - 讀取控制文件,你讀FlowControl.xlsx將它保存記錄集目標,到RecordOutput變量

img2

第三步: 你的優先約束應該像下面的圖片(「全」爲滿負荷,「增量」增量負載):

img3

使用的源和目標連接,如圖中第一張圖像。解釋所有步驟有點困難,但流程很簡單。

one需要注意的是,您在增量中有額外的列,因此您需要在滿負載中使用「派生列」以進行正確的映射。

此外,請確保DelayValidation屬性設置爲true。

對於每個循環容器使用For each ADO Enumerator。以下圖片描述的屬性:

img

imgx

+1

謝謝@Prabhat G.我已經測試過這個解決方案,它的工作原理。 – MayowaO

1

我可以想到兩個解決方案。

1)在包的開頭有一個腳本任務,看看它是增量加載還是滿載。如果它是滿載的,讓它循環遍歷所有文件,併爲每個文件添加一個「全部刪除」列,並且全部爲零。然後你可以使用相同的列表。

2)使用BiML根據可用的元數據在運行時動態生成軟件包。

+0

謝謝@Tab。這將涉及在運行時對文件(1)或包(2)進行額外處理。這不會花費很長時間來運行和消耗資源嗎?我可以試一試 – MayowaO

+0

它的確在時間和資源上增加了一些開銷,但可能並不多。這是一個權衡,不必爲每個文件編寫2個數據流。 –

+0

每個文件不需要2個數據流。檢查我的解決方案和邏輯。希望值得一試 –