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

时间:2012-10-24 20:11:50

标签: sql sql-server tsql

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

第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属性之后没有',',即使在年之后还有另一个属性Grade为NULL

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

6 个答案:

答案 0 :(得分:19)

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

myTestFormatFiles.Fmt可能如下所示:

9.0
4
1       SQLINT        0       3       ","      1     StudentNo      ""
2       SQLCHAR       0       100     ","      2     FirstName      SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     LastName       SQL_Latin1_General_CP1_CI_AS
4       SQLINT        0       4       "\r\n"   4     Year           "

http://i.msdn.microsoft.com/dynimg/IC45684.gif

This tutorial使用BULK INSERT跳过列也可能会有所帮助。

您的陈述如下:

USE xta9354
GO
BULK INSERT xta9354.dbo.Students
    FROM 'd:\userdata\xta9_Students.txt' 
    WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')

答案 1 :(得分:8)

就我而言,我正在处理一个由linux盒子上的hadoop生成的文件。当我尝试导入到SQL时,我遇到了这个问题。最后修复是使用十六进制值进行换行' 0X0A。它也适用于批量插入

bulk insert table from 'file' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')

答案 2 :(得分:2)

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

答案 3 :(得分:1)

以上选项也适用于Google大查询文件。我将表数据导出到goodle云存储并从那里下载。虽然向sql服务器加载相同的问题但是在将行分隔符指定为<​​/ p>之后可以成功加载文件

ROWTERMINATOR = '0x0a' 

也要注意标题记录并指定

FIRSTROW = 2

我从谷歌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
        )

答案 4 :(得分:0)

添加了对文件夹,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

答案 5 :(得分:0)

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

可能的解决方法:

  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