2016-09-06 138 views
0

我想从tsv(选项卡分隔值)文件导入数据到一个表使用SQL Server和Visual Studio,我遇到一个错误,我似乎无法固定。我能够重新创建我的数据库的一个小例子,并模仿我遇到的问题。SQL Server批量插入类型不匹配错误从csv

我创建了一个新的表在我的数据库从.sql文件以下属性:

CREATE TABLE [dbo].[TestTable] 
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
    [variable1] INT NULL, 
    [variable2] INT NULL, 
    [variable3] INT NULL 
) 

我想的ID是自动生成的,每当行添加到表中。对于我的部署后脚本我读的TSV文件:

BULK INSERT TestTable 
FROM 'C:\Users\me\Documents\projects\testData.txt' 
WITH 
(
    FIELDTERMINATOR = '\t', --CSV field delimiter 
    ROWTERMINATOR = '\n', --Use to shift the control to next row 
    ERRORFILE = 'C:\Users\me\Documents\projects\testDataError.txt' 
) 

这是由制表符分隔我的数据文件:

11 11 11 
22 22 22 
33 33 33 

而且最后我得到的错误:

消息4864,级别16,状态1,行12
第1行第3列(变量2)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

消息4832,级别16,状态1,行12
批量加载:在数据文件中遇到意外的文件结尾。

Msg 7399,Level 16,State 1,Line 12
链接服务器“(null)”的OLE DB提供程序“BULK”报告了错误。提供者没有提供任何关于错误的信息。

Msg 7330,Level 16,State 2,Line 12
无法从链接服务器“(空)”的OLE DB提供程序“BULK”中获取一行。

我最关心的第一个错误,任何其他错误的意见,以及将不胜感激。谢谢!

编辑:Hex文件添加hex info for data file

错误文件打印到testDataError.txt

11 11 11 
22 22 22 
33 33 33 
33 33 33 

编辑:第二个十六进制文件添加用于数据文件 Second Hex Dump

+0

很难说肯定,但我敢打赌,你的输入文件有两个值之间的意想不到的字符。对于此输入,两列之间的所有SQL期望都是一个选项卡。我会使用十六进制编辑器并查看该文件。您还应该确保该行仅以换行符(\ n)结尾,因为\ r \ n是Windows标准。 –

+0

我找到了一个在线十六进制文件编辑器,并在该问题中附加了一个链接。数据值之间的右列中的点是否代表文件中的字符? – ans

+0

该文件甚至不符合您的规范。查看http://www.asciitable.com了解这些值。 –

回答

0

既然你有4列包括主键列,你必须提供所有四列的数据。因此,第一个是IDENTITY列,您可以为该列提供任何值,因为此列值不会被使用,但会被省略。

在你的情况,如果你提供的数据像它会工作:

1 11 11 11 
1 22 22 22 
1 33 55 66 

我已经检查,发现这个它的工作原理。如果您没有任何选项来更改csv文件,则可以创建没有标识列的登台表并执行批量插入操作。之后,您可以通过执行INSERT INTO命令将数据从暂存表移动到目标表。我希望这可以解决你的问题。

+0

工作就像一个魅力!谢谢一堆! – ans

+0

然后不要忘记标记为答案。 :-) @ans –

+0

洛尔感谢您的提醒! – ans