1. 程式人生 > >關於EXCEL資料匯入到SQLSERVER中欄位存在NULL的問題

關於EXCEL資料匯入到SQLSERVER中欄位存在NULL的問題

第一種方法

1.在資料庫中建表

2.然後通過將excel中的資料拷貝到Uedit32裡面,通過列塊模式操作成insert into ... values ('',''...),成功完成,這種方法還算簡便,但是對於沒有Uedit32(或之類軟體)的朋友來說,這個方法沒有可行性。

第二種方法

(我目前採用的第二種方法,因為沒有安裝Uedit,'Microsoft.Jet.OLEDB.4.0也使用不了

將excel另存為.txt檔案的格式,然後通過SQLServer自帶的DTS工具匯入,(DTS匯入老是保錯)

我使用的是SQL 匯入:

bulk insert  _data0510
from 'D:\1235.txt'--檔案路徑'd:\kq\kq.txt'
with
(FIELDTERMINATOR = '\t',--欄位間分隔符號,\t製表符
ROWTERMINATOR = '\n'--每條記錄分隔符
)

應該還有種通過T-SQL語句的方法來匯入的,語句如下,但是測試了一下還有問題,如下:


在工作中,而且還是專案上線割接中碰到,結果電話號碼資料全亂套了,後果很嚴重,幸好,在網上找到了這篇文章,有了解決的指望,希望下週一客戶能允許我在生產庫解決掉這個問題。

在Excel中,我們時常會碰到這樣的欄位(最常見的就是電話號碼),即有純數字的(如沒有帶區號的電話號碼),又有數字和其它字元混合 (如“區號-電話號碼”)的資料,在匯入SQLServer過程中,會發現要麼純數字的資料導過去之後變成了NULL,要麼就是數字和其它字元混合的資料導過去之後變成了NULL。

    為什麼有些是純數字的資料導過去之後變成了NULL,有些卻是數字和其它字元混合的資料導過去之後變成了NULL,原來是在將Excel資料匯入

SQLServer過程中,SQLServer會做出判斷,是採用float型還是nvarchar型來接受資料,測試發現(沒有科學依據),SQLServer採用哪一型取決於將要匯入

的資料中本身具有哪一型的記錄數比例多,如10筆資料,有4筆沒有帶區號的電話號碼,6筆是帶區號的電話號碼,那麼轉到SQLServer就會選擇

nvarchar型,結果就是4筆沒有帶區號的電話號碼導過去之後全成了NULL,反之亦然。不管怎麼樣,我們最終都希望SQLServer是採用nvarchar來接受

資料,畢意我們要匯入的資料中有數字和其它字元混合的資料,用float型來接受是不可能的,這樣只要我們解決了將純數字的資料轉換成字元型並讓

SQLServer接受就可以了。

    我首先想到的就是將這個欄位的所有資料在Excel中設定為文字格式,剛才說了本來就是希望匯入SQLServer時成為字元型,但結果令人失望,不起作用。

    最終網上搜索到了答案:混合資料型別列的強制解析——IMEX=1
使用 IMEX=1 選參之後,只要取樣資料裡是混合資料型別的列,一律強制解析為 nvarchar/ntext 文字。當然,IMEX=1 對單一資料型別列的解析是不影

響的。

SELECT * INTO Table08 
FROM OpenDataSource
('Microsoft.Jet.OLEDB.4.0','Data Source="E:\1.xls";Extended properties="Excel 5.0;HDR=Yes;IMEX=1;"')...[Sheet1$]

    注:
    1.這條語句是在SQLServer查詢分析器中執行,並且要選擇好資料庫,否則會把要匯入的資料往別的資料庫中導了。
    2.Table08是資料匯入後在SQLServer中的表名,屬於新建,所以請確認在匯入資料前資料庫中沒有該表名,否則會提示已存在同一表名。
    3.Data Source,不要連在一起寫,中間有一空格。
    4.E:\1.xls,為Excel所在的絕對路徑和資料庫名。
    5.Excel 5.0,根據不同的Excel版本寫5.0或8.0或其它。
    6.IMEX=1,是轉換成文字輸入的意思,非常重要,如果沒有,就跟你直接匯入效果一樣。
    7.Sheet1是表名,千萬別看到語句中有$就在表名後加上$,因為$是語句要加的,別畫蛇添足。