2010-03-10 52 views
0

我有一個即使輸入錯誤也不會出錯的SSIS包。在我的情況下,這個包從平面文件中讀取並將記錄放入SQL Server表中。很簡單,沒有什麼奇特的事情在這裏發生。即使輸入數據不正確,SSIS包也不會失敗

平面文件被定義爲正確的,每行80個字符,總共可能有10列。問題:有時平面文件沒有填充到80個字符,所以我們得到可變長度的行,而不是填充其餘的空格。發生這種情況時我們希望失敗。

在我的平面文件源組件中,我設置了錯誤輸出部分,以便如果任何列被截斷,組件將失敗。但是由於某些原因,即使沒有導入行,我從Visual Studio運行包時,所有步驟都是綠色的。這裏是我得到的輸出:

SSIS包「SSIS包01.dtsx」開始。

信息:0x4004300A將數據導入到Table01,DTS.Pipeline:驗證階段開始。

信息:0x4004300A將數據導入到Table01,DTS.Pipeline:驗證階段開始。

信息:0x40043006在數據導入Table01,DTS.Pipeline:準備執行階段正在開始。

信息:0x40043007將數據導入到Table01,DTS.Pipeline:預執行階段開始。

信息:0x402090DC在數據導入到Table01,平面文件源[1]:文件的處理 「C:\ import_files \ sampledata.dat」 已經開始。

信息:0x4004300C在導入數據到表01,DTS.Pipeline:執行階段開始。

警告:0x8020200F在數據導入到Table01,平面文件源[1]:有一個在文件的結尾部分行。

信息:0x402090DE在數據導入到Table01,平面文件源[1]:文件 「C:\ import_files \ sampledata.dat」 處理的數據行的總數爲0。

信息:0x402090DF在將數據導入到Table01,OLE DB目標[5467]:數據插入的最終提交已開始。

信息:0x402090E0在導入數據到Table01,OLE DB目標[5467]:最後提交的數據插入已經結束。

信息:0x40043008將數據導入到Table01,DTS.Pipeline:後期執行階段開始。

信息:0x402090DD在數據導入到Table01,平面文件源[1]:文件的處理 「C:\ import_files \ sampledata.dat」 已經結束。

信息:0x40043009將數據導入到Table01,DTS.Pipeline:清理階段開始。

信息:0x4004300B在導入數據到Table01,DTS.Pipeline: 「組件 」OLE DB目標「(5467)」 中寫道0行。

....因此沒有記錄被導入,並且有關於部分行的警告,但是包成功完成。當這個軟件包輸入一個好的輸入文件時,每行有80個字符,它將導入與文件中一樣多的行,而沒有問題。

奇怪的是我們有其他SSIS包失敗時,可變長度的行被用作輸入。我已經看過,並將這些軟件包與此進行了比較,並且對於我的生活而言,他們看不到他們可能做的不同。

如果您有任何想法或線索,我可以關注我會很感激。謝謝!

回答

0

好的,我們已經弄清了這個問題。發生什麼事是每行中的最後一列需要一個CR/LF ColumnDelimiter。

因此,當第一行被處理並且出現短缺時,SSIS不會僅僅因爲它來得太快而不會確認CR/LF。它繼續並作爲第一行的一部分處理第二行。在這種情況下,第二行是所有剩下的,並且我們得到上面提到的截斷消息,因爲在字符80處從不會遇到CR/LF。

對於其他SSIS包的確失敗的情況,的行數足夠接近預期的行寬度,當程序包嘗試將它們填充到單個字段中時,會觸發該字段上的截斷錯誤。

相關問題