2008-10-17 55 views
1

我有樹表,客戶,發票和InvoiceRow與標準關係。如何使用SSIS導出具有不同行的平面文件?

這些我必須在一個固定的字段長度文件中導出,每行的前兩個字符標識行的類型。行類型有不同的規格。

我大概可以在腳本塊中使用嵌套循環來做到這一點,但這是我第一次使用SSIS包,該解決方案感覺不對。

編輯:

輸出必須具有:

Customer 
Invoice 
Rows 
Customer 
Invoice 
Rows 
and so on 

回答

1

您使用腳本目標組件執行此操作的直覺是正確的。不幸的是,這種情況並沒有很好地與SSIS合作。我不認爲這是一個初學者包。如果您必須使用SSIS,那麼我會先從內部加入所有數據開始,這樣每個InvoiceRow就有一行,包含所有三個表所需的數據。

CustomerCols,InvoiceCols,RowCols

然後,在腳本目標組件,您需要跟蹤的客戶和發票價值的,因爲他們改變你將需要額外的行寫入到輸出。

有關腳本目標的更多信息,請參閱Creating a Destination with the Script Component

我的經驗表明,腳本目標可以有很好的性能。

0

過程您的三個表,使得輸出都適合於輸出文件(包括行類型指示符)。您必須在數據流中的三個單獨的流路徑中執行此操作,然後將這些行集中到Union All數據流元素中。從那裏,根據需要處理它們以創建您的輸出文件。

+0

如何獲得輸出中行的正確排序?第一位顧客;它的發票和他們的行。下一位客戶,其發票等。 – idstam 2008-10-17 19:46:06

1

我會避免寫腳本目標,並只使用腳本轉換+平面文件目標。這樣,您就可以專注於邏輯輸出(數據字符串),同時允許SSIS對文件進行實際寫入(效率可能更高一些,再加上專注於業務而不是寫入文件)。

首先,您需要獲得非規格化數據。您可以在DBMS中進行連接和排序,但是如果您不想對DBMS施加太多壓力 - 只需從中排序數據並使用兩個SSIS合併連接轉換進行合併即可。

然後做腳本:保持當前Customer和Invoice的運行值,當它們改變時輸出它們,在每個輸入上輸出InvoiceRow。事情是這樣的:

if (this.CustomerID != InputBuffer.CustomerID) { 
    this.CustomerID = InputBuffer.CustomerID; 
    OutputBuffer.AddRow(); 
    OutputBuffer.OutputColumn = "Customer: " + InputBuffer.CustomerID + " " + InputBuffer.CustomerName; 
} 
// repeat the same code for Invoice 

OutputBuffer.AddRow(); 
OutputBuffer.OutputColumn = "InvoiceRow: " + InputBuffer.InvoiceRowPrice; 

最後,添加一個平面文件目標與單個列(由腳本創建OutputColumn)寫這篇的文件。