最近處理excel資料導入到Sql Server中,失敗,報錯如下:
作為源列3(“産品說明”)的資料對于所指定的緩沖區來講太大。
我的excel檔案中有一列叫“産品說明”,就是一些文字。Sql server處理導excel資料流程是這樣的,它會先建立目标表,再把excel資料寫入緩沖區,然後再把緩沖區資料寫入目标表。問題就在建立目标表和寫入緩沖區,sql server會根據現在的excel中的資料格式來寫入緩沖區和建立目标表。比如excel中有一列為編号,裡面是數字,sqlserver就會在目标表裡建一列叫“編号”,為float類型.
而對于我的excel檔案中的"産品說明"這一列,是文字,那sql server如何建立目标列或緩沖區呢?它怎麼知道該把目标建立成varchar還是text呢?經過測試,發現sql server是這樣做的,他會取excel檔案中的前8行(2的三次方),然後算這8行裡“産品說明”的最大長度,如果這8行裡最長的 > 255,則目标列和緩沖區就會建立成ntext類型,否則就建立成nvarchar類型。這樣,問題就來了!假設我的excel檔案前8行“産品說明”中都 < 255,則目标和緩沖區就被建立為varchar(255)類型了(這裡說明一下,你可以修改目标表的字段類型,但緩沖區長度或類型是無法修改的)。而如果我的第10行裡“産品說明”的長度超過了255,則sql server往緩沖區裡寫的時候,自然就發生了如上的錯誤:資料對于指定的緩沖區來講太大。
這樣,我們導資料當然就失敗了!這個也許不能算bug,因為隻是實作得不好(取某列前8行的最大長度并不能真正代表所有行,我想microsoft的工程師為了簡單或者提高性能才這樣做的);也許算是bug,因為不知情的使用者導資料失敗了。而且不知道為何而失敗的!
公理自在人心,讓大家或那些工程師們去評判吧!
解決辦法:
修改系統資料庫: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel 下輕按兩下右邊的"TypeGuessRows"選項,将"數值資料"改成0。 修改之後關機重新啟動。
原因是:将excel表的資料導入資料庫的時候,Jet引擎根據"TypeGuessRows"選項的值所代表的行數判斷内容的資料類型,預設是根據前8行的内容判斷資料類型,修改成0後,它會對每行的内容進行判斷,不過這樣做會影響性能。
其他方法:
1 把比較具有代表性的行移到Excel的第一或二行。
2 對于特殊列,該列含有:(True, False, 以及其它Text),把True和False改為其他值(OLDTrue, OLDFalse),導入之後再改回原值(True,False)。
3 先導入到Access中再導入到SQL Server。