2015-04-30 54 views
1

我試圖用OPENROWSET查詢csv文件,其工作的時間以及90%,但由於某些原因,一些文件的.csv返回了這個錯誤:SQL:OPENROWSET不返回數據正確

Msg 4863, Level 16, State 1, Line 1 
Bulk load data conversion error (truncation) for row 1, column 5 (Status Description). 

或這個錯誤:

Msg 4832, Level 16, State 1, Line 1 
Bulk load: An unexpected end of file was encountered in the data file. 

我的查詢是這樣的:

select * from OPENROWSET(BULK 'E:\File.csv', FORMATFILE= 'E:\schema.xml') AS a 

我的格式文件看起來像這樣:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\0\n\0" MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
<COLUMN SOURCE="1" NAME="Column1" xsi:type="SQLNVARCHAR"/> 
<COLUMN SOURCE="2" NAME="Column2" xsi:type="SQLNVARCHAR"/> 
<COLUMN SOURCE="3" NAME="Column3" xsi:type="SQLNVARCHAR"/> 
<COLUMN SOURCE="4" NAME="Column4" xsi:type="SQLNVARCHAR"/> 
<COLUMN SOURCE="5" NAME="Column5" xsi:type="SQLCHAR"/> 
</ROW> 
</BCPFORMAT> 

我發現,如果我在我的.csv的內容複製到一個全新的文件並保存然後重新運行該查詢將成功完成。但是,這是不理想的那麼扭捏格式文件並運行相同的查詢後,現在我得到這樣的結果:

Column 1 Column2 Column3 Column4 
ÿþD    
m    
m    
m    
m    
m    

當我的原始數據是這樣的:

Column 1 Column2 Column3 Column4 
Abc  elephant Yes  Job has finished.    
def  tiger  Yes  Job has finished. 
xyz  monkey Yes  Job has finished. 
ghi  dog  Yes  Job has finished.  

看來,現在查詢正在完成但正在返回垃圾數據。

有誰知道如何解決這個問題,以便我可以返回準確的結果?

+0

打開一個導致錯誤的記事本,然後單擊文件,另存爲。在另存爲對話框中,查看底部並查看它是否是Unicode(或ANSI以外的任何其他)。如果是,請將其更改爲ANSI並保存並查看它是否有效。 –

+0

其實,仔細閱讀你的問題我很肯定Unicode編碼是問題,因爲ÿþ是一個字節順序標記。 http://en.wikipedia.org/wiki/Byte_order_mark –

+0

如果文件爲Unicode,則可以運行'cmd/a/c type myfile.csv> myansifile.csv'命令將文件轉換爲ANSI。 –

回答

2

ÿþ是一個字節順序標記,它告訴我這是一個Unicode編碼文件。無論什麼文件讀取都不夠聰明,無法處理Unicode文件,因此無法讀取它。

您需要修改創建文件以使用ANSI的任何內容,或者修改您用來讀取文件以處理Unicode的內容。

要解決的問題,我們也可以將文件中使用type命令ANSI和輸出重定向到一個新的文件:該.csv文件的

cmd /a /c type myfile.csv > myansifile.csv