1. 程式人生 > >SSIS獲得Excel行號(轉自http://blog.csdn.net/zplume/article/details/19113911)

SSIS獲得Excel行號(轉自http://blog.csdn.net/zplume/article/details/19113911)

number source 行數 put article 情況 art r+ 數據庫

問題描述: 首先個人並不推薦將Excel作為數據源,因為Excel單元格式會引起特別多的數據轉換問題,例如:單元格裏明明是2.89,但SSIS抽取到數據庫裏面之後卻變成了2.88999999之類的數據。 這裏要介紹的是假如萬不得已需要用Excel作為數據源時,經常會需要取得Excel每一行的行號,當然假如允許可以在Excel裏面新增加一列並賦予公式=Row()。但很多情況是源文件並不允許被輕易改動。那麽,如何獲得數據的行號,以方便今後漫長的歲月中,support同事們進行錯誤追蹤呢?

環境:SQL SERVER 2008,SSIS 2008, Office 2003

解決思路:

因為Excel 2003中的數據最大只有65535行數據,因此在SSIS裏面的new output裏面加一列名為RowNo, 並增加一個自增變量, 每一次抽取一行數據的時候就將該字增變量賦給RowNo。 之前想到這個方式的時候我很擔心SSIS並不是順序讀取Excel裏面的每一行數據,也可能是隨機讀取Excel裏面的數據直到讀完。後來有同學說,反正只有65535行數據,測試一下先造一個65535行的數據樣本,用Excel去抽取,看看是不是每一行都是順序讀取的,假如這65535都是順序讀取的。那測試就通過了。

解決方法:

在Data Flow裏面加入Excel Source後面緊接著放一個Script控件,為該Script控件新建一個Output Column名為: SeqNo. 點擊Edit Script進去後,設置一個全局私有變量:

private int _RowNumber = 2;

在Input0_ProcessInputRow(Input0Buffer Row)方法裏面設置:

Row.DataLineNumber = _RowNumber;

Row.SeqNo = Variables.SeqNo;

_RowNumber++

結論:

SSIS在讀取Excel數據的時候確實是順序讀取的,上面在Script中新建的SeqNo列值和測試的Excel數據樣本裏面的某一列被賦予=Row()的列值完全相同。

SSIS獲得Excel行號(轉自http://blog.csdn.net/zplume/article/details/19113911)