我有樹表,客戶,發票和InvoiceRow與標準關係。如何使用SSIS導出具有不同行的平面文件?
這些我必須在一個固定的字段長度文件中導出,每行的前兩個字符標識行的類型。行類型有不同的規格。
我大概可以在腳本塊中使用嵌套循環來做到這一點,但這是我第一次使用SSIS包,該解決方案感覺不對。
編輯:
輸出必須具有:
Customer
Invoice
Rows
Customer
Invoice
Rows
and so on
我有樹表,客戶,發票和InvoiceRow與標準關係。如何使用SSIS導出具有不同行的平面文件?
這些我必須在一個固定的字段長度文件中導出,每行的前兩個字符標識行的類型。行類型有不同的規格。
我大概可以在腳本塊中使用嵌套循環來做到這一點,但這是我第一次使用SSIS包,該解決方案感覺不對。
編輯:
輸出必須具有:
Customer
Invoice
Rows
Customer
Invoice
Rows
and so on
您使用腳本目標組件執行此操作的直覺是正確的。不幸的是,這種情況並沒有很好地與SSIS合作。我不認爲這是一個初學者包。如果您必須使用SSIS,那麼我會先從內部加入所有數據開始,這樣每個InvoiceRow就有一行,包含所有三個表所需的數據。
CustomerCols,InvoiceCols,RowCols
然後,在腳本目標組件,您需要跟蹤的客戶和發票價值的,因爲他們改變你將需要額外的行寫入到輸出。
有關腳本目標的更多信息,請參閱Creating a Destination with the Script Component。
我的經驗表明,腳本目標可以有很好的性能。
過程您的三個表,使得輸出都適合於輸出文件(包括行類型指示符)。您必須在數據流中的三個單獨的流路徑中執行此操作,然後將這些行集中到Union All數據流元素中。從那裏,根據需要處理它們以創建您的輸出文件。
我會避免寫腳本目標,並只使用腳本轉換+平面文件目標。這樣,您就可以專注於邏輯輸出(數據字符串),同時允許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)寫這篇的文件。
如何獲得輸出中行的正確排序?第一位顧客;它的發票和他們的行。下一位客戶,其發票等。 – idstam 2008-10-17 19:46:06