2012-05-21 16 views
1

假定一個平面文件F1.txt,Column MyCol1和一個包Pkg1將所述文件加載到SQL Server。帶有較少列的平面文件連接的SSIS pkg將失敗

沒問題吧?對。

現在假設一個平面文件F2.txt,Columns MyCol1,MyCol2和相同的包Pkg1將所述文件加載到SQL服務器。

我們將對Pkg1和presto進行一些調整 - 它會像夢一樣加載F2.txt。

現在我們餵它F1.txt,這就是事情惡化的地方。

順便說一句,這並不侷限於平面文件,而是具有更普遍的性質。

歡迎任何關於如何在同一包中運行遺留數據的建議。

TIA

彼得

+0

只要更改源,包元數據就會過期。通過這樣說,我假設當您嘗試加載F2.txt時,實際上將F1.txt移動到其他位置。 – rvphx

+0

我的回答應該是其他方式(我沒有找到我的評論的編輯按鈕)「通過這樣說,我假設當您嘗試加載F1.txt時,實際上將F2.txt移動到其他位置」 – rvphx

+0

您可以爲每個元數據類型創建一個數據流。然後在數據流之前,創建一個腳本任務,根據文件佈局確定應該使用哪個數據流。 –

回答

1

它讀起來就像你在這裏有兩個問題。首先是瞭解如何使用連接管理器。對於平面文件輸入,通常會通過爲每個文件佈局創建連接管理器來更好地服務。文件1看起來像(Column1),文件2看起來像(Column1,Column2)?這意味着需要定義2個不同的平面文件連接管理器。

如果您有2個版本的文件2,其中一個Column1包含數字,另一個包含字符數據的Column1,則需要2個唯一連接管理器(共3個)。

與上述相關的好消息是文件名稱更改很簡單,並且不需要創建唯一的連接管理器。 F1.txt,F1_20120501.txt,F1.good.txt等都將由您爲該佈局定義的連接管理器提供服務。您只需在給定連接管理器的ConnectionString屬性上使用表達式即可在運行時更新當前包。

所以,現在你有所有這些平面文件連接管理器,你需要使用它們。這種奇蹟發生在數據流任務中。數據流對於其中使用的元數據是真實的。在設計數據流時,您正在與SSIS簽訂合同,如果您試圖通過將字符字段設置爲日期字段或未提供所有列來違反該合同,則該程序包將因未持有驗證檢查而失敗討價還價的結束。對此的解決方案是,您將再次需要定義您的軟件包需要的各種連接管理器周圍的多個數據流。

隨着所有定義,你只需要一個協調器來查看源文件,以確定應執行哪個數據流。我在這個問題上提供了一個例子Create SSIS package to import from one of many data sources

還有一個類似的問題,我提出了一個可能感興趣的解決方案SSIS Task for inconsistent column count import?這真的取決於您的規則是用於處理什麼的。

如果您試圖在您的SSIS包中整合/重用業務邏輯,那麼我會考慮使用各種數據流來將離散數據源轉換爲單數據存儲的東西(原始文件,具有大量空列等)。

+0

我認爲billinkc(這是比爾在KC?)很好地總結了它。非常感謝您煞費苦心,我會看看兩者。 – webhiker