SQL: OPENROWSET 未正确返回数据
SQL: OPENROWSET not returning data correctly
我正在尝试使用 OPENROWSET 查询一个 csv 文件,该文件在 90% 的情况下都运行良好,但由于某些原因,某些 .csv 文件 return 出现此错误:
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[=14=]\n[=14=]" 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.
现在查询似乎正在完成,但是正在 returning 垃圾数据。
有谁知道如何解决这个问题以便我可以 return 获得准确的结果?
ÿþ是一个字节顺序标记,告诉我这是一个Unicode编码的文件。任何正在读取文件的设备都不够智能,无法处理 Unicode 文件,因此无法读取它。
您需要修改创建文件的任何内容以使用 ANSI,或者修改您用来读取文件的内容以处理 Unicode。
要解决此问题,您可以使用 type 命令将文件转换为 ANSI,并将输出重定向到新文件:
cmd /a /c type myfile.csv > myansifile.csv
我正在尝试使用 OPENROWSET 查询一个 csv 文件,该文件在 90% 的情况下都运行良好,但由于某些原因,某些 .csv 文件 return 出现此错误:
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[=14=]\n[=14=]" 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.
现在查询似乎正在完成,但是正在 returning 垃圾数据。
有谁知道如何解决这个问题以便我可以 return 获得准确的结果?
ÿþ是一个字节顺序标记,告诉我这是一个Unicode编码的文件。任何正在读取文件的设备都不够智能,无法处理 Unicode 文件,因此无法读取它。
您需要修改创建文件的任何内容以使用 ANSI,或者修改您用来读取文件的内容以处理 Unicode。
要解决此问题,您可以使用 type 命令将文件转换为 ANSI,并将输出重定向到新文件:
cmd /a /c type myfile.csv > myansifile.csv