Excel檔案匯入到SQL,文字、數字丟失,變成NULL的處理
匯入一個Excel到Sql,好方便進行資料的篩選,但是卻發現,在匯入後,電話欄位有很多資料丟失,變成了Null,經過仔細檢查,發現丟失的都是包含有字元型的(如區號與號碼之間的-),再檢視一下匯入後的sql表,電話所在欄位型別為float型別~~~難怪會有很多資料丟失了。。
將Excel中的該列單元格格式改為 文字 格式,再匯入,已經不行。
搜尋一番,發現有一個方法,不過這個方法只針對於完全數字格式的欄位,如若想匯入的是數字格式,而非字串格式,就需要這樣的做法:
1、將匯入的過程存為DTS包,將此DTS包找到
2、在剛才儲存的DTS包上右鍵,編輯包
3、在編輯器裡右鍵單擊空白處,選擇“脫接屬性”命令。
4、依次展開“連線”——excel的那個連線——>“OLE DB屬性“,找到“Extended Properties”屬性。
5、將右邊的“Value”屬性的值改為“Excel 8.0;HDR=YES;IMEX=1”
6、儲存此包、並執行即可。
關於第五步中的IMEX設定有如下解釋:
IMEX是用來告訴驅動程式使用Excel檔案的模式,其值有0、1、2三種,分別代表匯出、匯入、混合模式。當我們設定 IMEX=1時將強制混合資料轉換為文字,但僅僅這種設定並不可靠,IMEX=1只確保在某列前8行資料至少有一個是文字項的時候才起作用,它只是把查詢前8行資料中資料型別佔優選擇的行為作了略微的改變。例如某列前8行資料全為純數字,那麼它仍然以數字型別作為該列的資料型別,隨後行裡的含有文字的資料仍然變空。
另一個改進的措施是IMEX=1與登錄檔值TypeGuessRows配合使用,TypeGuessRows 值決定了ISAM 驅動程式從前幾條資料取樣確定資料型別,預設為“8”。可以通過修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Jet\4.0\Engines\Excel”下的該登錄檔值來更改取樣行數。但是這種改進還是沒有根本上解決問題,即使我們把IMEX設為“1”, TypeGuessRows設得再大,例如1000,假設資料表有1001行,某列前1000行全為純數字,該列的第1001行又是一個文字,ISAM驅動的這種機制還是讓這列的資料變成空。
但是這也僅僅是匯入數字型別的欄位,如果要匯入為字元型的,比如說我們的電話號碼形式的(010-21345678),這種做法是行不通的,但是還有另外一種很簡單的方法,就是將Excel檔案匯出成Csv格式的檔案,再將csv匯入到Sql,就可以很方便的把電話號碼匯入進去了。這種做法也僅限於匯入字元型的資料,因為CSV格式為文字格式,不包括資料型別,如果需要匯入後資料為數字型別,就需要用上邊的方法了。