文章詳情頁
SQL Server導入excel數(shù)據(jù)之Bug!
瀏覽:114日期:2022-08-04 10:11:36
最近幫朋友把他整理的excel數(shù)據(jù)導入到Sql Server中,失敗,報錯如下:作為源列4(“產(chǎn)品說明”)的數(shù)據(jù)對于所指定的緩沖區(qū)來講太大。 我的excel文件中有一列叫“產(chǎn)品說明”,就是一些文字。Sql server處理導excel數(shù)據(jù)流程是這樣的,它會先創(chuàng)建目標表,再把excel數(shù)據(jù)寫入緩沖區(qū),然后再把緩沖區(qū)數(shù)據(jù)寫入目標表。問題就在創(chuàng)建目標表和寫入緩沖區(qū),sql server會根據(jù)現(xiàn)在的excel中的數(shù)據(jù)格式來寫入緩沖區(qū)和創(chuàng)建目標表。比如excel中有一列為編號,里面是數(shù)字,sqlserver就會在目標表里建一列叫“編號”,為float類型. 而對于我的excel文件中的'產(chǎn)品說明'這一列,是文字,那sql server如何建立目標列或緩沖區(qū)呢?它怎么知道該把目標建立成varchar還是text呢?經(jīng)過測試,發(fā)現(xiàn)sql server是這樣做的,他會取excel文件中的前8行(2的三次方),然后算這8行里“產(chǎn)品說明”的最大長度,如果這8行里最長的 > 255,則目標列和緩沖區(qū)就會建立成ntext類型,否則就建立成nvarchar類型。這樣,問題就來了!假設(shè)我的excel文件前8行“產(chǎn)品說明”中都 < 255,則目標和緩沖區(qū)就被建立為varchar(255)類型了(這里說明一下,你可以修改目標表的字段類型,但緩沖區(qū)長度或類型是無法修改的)。而如果我的第10行里“產(chǎn)品說明”的長度超過了255,則sql server往緩沖區(qū)里寫的時候,自然就發(fā)生了如上的錯誤:數(shù)據(jù)對于指定的緩沖區(qū)來講太大。 這樣,我們導數(shù)據(jù)當然就失敗了!這個也許不能算bug,因為只是實現(xiàn)得不好(取某列前8行的最大長度并不能真正代表所有行,我想microsoft的工程師為了簡單或者提高性能才這樣做的);也許算是bug,因為不知情的用戶導數(shù)據(jù)失敗了。而且不知道為何而失敗的! 公理自在人心,讓大家或那些工程師們?nèi)ピu判吧!
標簽:
excel
排行榜
