今天,我的Team Leader讓load一些數據到
數據庫中去,之前這樣的事情我也做過。沒有遇到過什麼錯誤,但是今天這個Excel讓我吃了不少苦頭。經過我不懈努力,最終解決了所有問題,順利完成任務。下面我把我遇到的問題寫下來和大家探討一下。
一、問題提出
這個Excel大概1W條數據,數據量不是很大,開始導入也很順利。不到一分鐘就完成了,結果我發現有一列數據全部變成了null,並且其他列的數據格式也不正確。然後我就更改了每個列的數據類型,結果導致數據無法導入。郁悶!
二、問題深化
於是我想到用
SQL語句去試一下,用下面的語句執行了一下。
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;HDR=YES;imex=1;Database=\\surrey-test\GS\GS_UNpaid.xls',
'SELECT * FROM [Sheet1$]')
結果出現,OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 'Sheet1$'。該表可能不存在,或當前用戶沒有使用該表的權限。
OLE DB 錯誤跟蹤[Non-interface error: OLE DB provider does not contain the table: ProviderName='Microsoft.Jet.OLEDB.4.0', TableName='Sheet1$']。
於是,詳細思考了一下。哦,原來我的Excel沒有放到Server上,放上去之後在此運行,數據查出來了。
三、設法解決
數據查出來之後格式依然不正確,不符合我們的要求,於是開始進行數據格式的轉換。開始的時候使用convert和cast把數據轉換為float類型,不行。於是再次轉換convert(float,convert(varchar(50),isnull(gs_guid,0))),這次格式對了,但是數據卻由於float類型的精度問題而發生了改變,不能滿足要求。於是使用
left(cast(cast(convert(float,convert(varchar(20),confirmation_no)) as decimal(20,7)) as varchar(20)),9),結果還是不能讓人滿意,數據失真了。苦思冥想,終於想到這條cast(cast(confirmation_no as decimal) as varchar),Ok。問題解決,欣喜若狂。
四、檢查問題
就在我要Submit的時候,卻發現一個致命的問題,所有數據格式正確的同時,竟然有一列數據發生了很大變化,於是認真查找,發現了問題的存在,對於這一列使用
cast(convert(bigint,convert(float,convert(varchar(50),isnull(gs_guid,0))))as varchar),問題終於搞定。
五、問題解決
最後使用
INSERT INTO temp4
select convert(char(4),car_no) as car_no,convert(datetime,[column name]) as pu_date,
cast(cast([column name] as decimal) as varchar),
--left(cast(cast(convert(float(5),convert(varchar(50),[column name])) as decimal(20,7)) as varchar(20)),10),
convert(decimal(12,2),[column name]),convert(char(4),dr_no),
cast(cast([column name]as decimal) as varchar),
cast(cast([column name] as decimal) as varchar),
--convert(float,convert(varchar(50),isnull([column name],0))),
cast(convert(bigint,convert(float,convert(varchar(50),isnull([column name],0))))as varchar),
cast(cast([column name]as decimal) as varchar),
--left(cast(cast(convert(float,convert(varchar(20),[column name])) as decimal(20,7)) as varchar(20)),10),
--left(cast(cast(convert(float,convert(varchar(20),[column name])) as decimal(20,7)) as varchar(20)),9),
--left(cast(cast( convert(float,convert(varchar(50),isnull([column name],0))) as decimal(20,7)) as varchar(20)),9),
--left(cast(convert(float,convert(char(20),[column name])) as varchar(20)),6),
convert(datetime,[column name]) ,isnull([column name],'')
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;HDR=YES;imex=1;Database=\\surrey-test\GS\GS_UNpaid.xls',
'SELECT * FROM [gs_voucher_notpaid$]')
將數據load到Database中去。
六、總結
導入數據雖然是件很簡單的事情,但是這裡面還是包含了很多知識。比如數據的存儲類型,數據庫中的一些常用函數,等等。希望,這些經驗能夠使我在項目中受益,同時也希望各位多多指點。