2011-09-10 57 views
-4

早在2000年,我就使用SQL Server DTS包進行了一些ETL開發。我開始使用設計器來創建包,但最終通過使用SQLDMO(數據庫管理對象)庫來動態生成包。在高層次上,生成的包將讀取輸入文件並將數據傳輸到臨時表。任何不符合預期列數據類型的記錄都會作爲錯誤記錄和錯誤消息記錄被踢出,以便記錄驗證失敗。此代碼一般編寫一次。SSIS用於處理「不良」數據的推薦做法

爲了實現此目的,首先將數據從平面CSV佈局源文件DTSed到「無類型」dest表中,其中表中的列與輸入文件中的列匹配,但列全部定義爲varchar(255) 。目的是首先獲取原始數據到一個表中,然後動態生成的SQL可以針對無類型表運行,以識別我們知道不會轉換爲預期數據類型的數據。記錄錯誤的類型或長度將自動被踢出到與輸入文件相同佈局的錯誤表中。然後,通用處理庫將動態創建一個DTS包,將其餘記錄轉移到「類型」表中,其中所有列現在都是預期的類型,而不僅僅是varchar。所有這些表都是在運行時動態創建的,所有這些都基於預期文件佈局的定義。

在這個初始階段之後還有更多,但是將數據存入數據庫並識別「壞」數據並記錄每個記錄不好的原因現在又一次成爲新系統的焦點,這次使用SSIS包。我正在考慮重新創建2000年使用SQLMO生成SSIS包並創建一個公共庫來處理這個使用.NET的過程,但我希望得到其他人正在做的更好的建議。

我個人對工具的偏好偏向於使用視覺方法與設計師一起開發SSIS包。就我個人而言,我覺得我有最好的控制和最好的開發環境,通過使用.NET來創建一個可重用的庫,它可以抽象出整個過程,並在豐富的開發語言的同時利用文件系統,SSIS和SQL服務。

我發現將文件定義放在一個表中有各種各樣的副作用。例如,我決定每個文件定義都會有一個標準頭文件,它可以唯一地標識哪個文件格式應該用來解析它。然後我編寫了一個編輯器,它可以在網格中顯示文件的內容,並允許編輯或動態生成一個DTS包,將數據傳輸到一個表中,以允許將數據作爲獨立工具進行查詢。此外,我生成的Word文檔將文件佈局顯示爲文檔,並創建了可供標準工具用於以指定格式提取數據的庫,以便使用它的源系統可保證以正確的格式提供數據。

所以,最後,我的問題:

  • Microsoft如何建議壞的數據進行處理和過程,怎麼能這樣不與每一個包重新發明輪子做什麼?我是SSIS新秀。
+1

-1:非常健談的問題 –

回答

3

在提取錯誤的數據方面沒有「銀彈」,我懷疑只有一個練習如何去做。 通常以下是可供選擇,同時從外部源導入數據(即基本上是「萃取」是):在第一個錯誤項

  1. 停止,報告中的條目。
  2. 處理整個導入,報告所有錯誤的條目,如果某些數據不好,請不要導入。
  3. 儘管存在一些不良數據,仍繼續導入,請將錯誤數據放入單獨的表中。

只要您的實施可以支持這三種情況,並允許用戶選擇或多或少覆蓋所有可能的應用程序。