25

当我尝试将文本文件导入数据库时​​出现转换错误。以下是我收到的错误消息:

第 1 行第 4 列(年份)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

这是我的查询代码:

CREATE TABLE Students
(
    StudentNo    Integer NOT NULL Primary Key,
    FirstName    VARCHAR(40) NOT NULL,
    LastName     VARCHAR(40) NOT NULL,
    Year         Integer,
    GPA          Float NULL
);

这是来自文本文件的示例数据:

100,Christoph,Van Gerwen,2011
101,Anar,Cooke,2011
102,Douglis,Rudinow,2008

我想我知道问题出在哪里。下面是我的批量插入代码:

use xta9354
bulk insert xta9354.dbo.Students
from 'd:\userdata\xta9_Students.txt' 
with (fieldterminator = ',',rowterminator = '\n') 

对于示例数据,Year 属性之后没有“,”,即使 Year 之后还有另一个属性 Grade 为 NULL

有人可以告诉我如何解决这个问题吗?

4

6 回答 6

27

尝试使用格式文件,因为您的数据文件只有 4 列。否则,请尝试OPENROWSET或使用临时表。

myTestFormatFiles.Fmt可能看起来像:

9.0
4
1 SQLINT 0 3 "," 1 学生号 ""
2 SQLCHAR 0 100 "," 2 名字 SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "," 3 姓 SQL_Latin1_General_CP1_CI_AS
4 SQLINT 0 4 "\r\n" 4 年 "


(来源:microsoft.com

关于跳过列的本教程BULK INSERT也可能会有所帮助。

您的陈述将如下所示:

USE xta9354
GO
BULK INSERT xta9354.dbo.Students
    FROM 'd:\userdata\xta9_Students.txt' 
    WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')
于 2012-10-24T20:54:25.360 回答
14

In my case, I was dealing with a file that was generated by hadoop on a linux box. When I tried to import to sql I had this issue. The fix wound up being to use the hex value for 'line feed' 0x0a. It also worked for bulk insert

bulk insert table from 'file' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')
于 2016-08-18T16:10:25.347 回答
3

我们也使用批量插入。我们上传的文件是从外部方发送的。经过一段时间的故障排除后,我意识到他们的文件中有带逗号的列。只是另一件事要寻找...

于 2018-09-25T15:14:31.280 回答
1

上述选项也适用于 Google 大查询文件。我将表格数据导出到 goodle 云存储并从那里下载。在将相同的内容加载到 sql server 时遇到此问题,并且在将行分隔符指定为后可以成功加载文件

ROWTERMINATOR = '0x0a' 

还要注意标题记录并指定

FIRSTROW = 2

我从 google bigquery 导出数据文件的最后一个块如下所示。

BULK INSERT TABLENAME
        FROM 'C:\ETL\Data\BigQuery\In\FILENAME.csv'
        WITH
        (
         FIRSTROW = 2,
         FIELDTERMINATOR = ',',  --CSV field delimiter
         ROWTERMINATOR = '0x0a',--Files are generated with this row terminator in Google Bigquery
         TABLOCK
        )
于 2018-05-01T06:47:55.120 回答
1

添加了对文件夹、diskadmin 和 bulkadmin 服务器角色的 MSSQLSERVER 完全访问权限。

在我的 c# 应用程序中,在准备批量插入命令时,

string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')";

我收到此错误 - 第 1 行第 8 列(状态)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

我查看了我的日志文件,发现终止符变成了 ' ' 而不是 '\n'。链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供者没有提供有关该错误的任何信息:

Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)". Query :BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\NEWSTAGEWWW\CalAtlasToPWCR\Results\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', **ROWTERMINATOR = ''**)

所以我为行终结符添加了额外的转义符 - 字符串 strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n' )";

现在它插入成功。

Bulk Insert SQL -   --->  BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\\NEWSTAGEWWW\\CalAtlasToPWCR\\Results\\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
Bulk Insert to PWCR_Contractor_vw_TEST successful...  --->  clsDatase.PerformBulkInsert
于 2019-02-23T21:35:20.717 回答
0

我的猜测是这是一个编码问题,例如您的文件是 UTF-8,但 SQL 不会以应有的方式读取它,因此它会尝试将 100ÿ 或类似这些行的内容插入您的表中。

可能的修复:

  1. 指定代码页
  2. 使用 Powershell 更改源的编码

代码示例:

1.
BULK INSERT myTable FROM 'c:\Temp\myfile.csv' WITH (
  FIELDTERMINATOR = '£',
  ROWTERMINATOR = '\n',
  CODEPAGE = 'ACP' -- ACP corresponds to ANSI, also try UTF-8 or 65001 for Unicode
);

2.
get-content "myfile.csv" | Set-content -Path "myfile.csv" -Encoding String
# String = ANSI, also try Ascii, Oem, Unicode, UTF7, UTF8, UTF32
于 2020-06-23T10:26:25.323 回答