当我尝试将文本文件导入数据库时,我收到转换错误。以下是我收到的错误消息:
第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
有人可以告诉我如何解决这个问题吗?
答案 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.
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