SQL - 读取具有意外EOF错误的CSV文件

时间:2017-03-18 20:06:09

标签: sql-server csv bulkinsert

我需要读取包含许多记录的.csv文件中的数据,但是在最后一行 有字符串“the_end”,之后没有LF符号。

这是我的csv文件:

1,James,Smith,19750101
2,Meggie,Smith,19790122
3,Robert,Smith,20071101
4,Alex,Smith,20040202
the_end

在我的sql脚本下面,它将数据读入临时表:

create table #Data 
(
id int,
first_name varchar(50),
last_name varchar(50),
birthdate smalldatetime
)


bulk insert #Data
from 'C:\Users\Michał\Desktop\csvtest.csv'
with
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)


select * from #Data

drop table #Data

错误是:

  

Msg 4832,Level 16,State 1,Line 13
  批量加载:数据文件中遇到意外的文件结尾。

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

  Msg 7330,Level 16,State 2,Line 13
  无法从OLE DB提供程序“BULK”获取链接服务器“(null)”。

的行

我想在没有最后一行标签“the_end”的情况下将所有数据读入我的表格,这是显而易见的。我该如何管理?我无法修改此文件,因为它是从外部提供的,我不能这样做。

2 个答案:

答案 0 :(得分:2)

使用lastrow option

bulk insert #Data
from 'C:\Users\Michał\Desktop\csvtest.csv'
with
(
FIELDTERMINATOR = ','
, ROWTERMINATOR = '\n'
, lastrow = 4
)

使用变量作为lastline的动态sql示例:

create table #Data (
    id int
  , first_name varchar(50)
  , last_name varchar(50)
  , birthdate smalldatetime
);

declare @lastline int = 4;

declare @sql nvarchar(max)= '
bulk insert #Data
from ''C:\Users\Michał\Desktop\csvtest.csv''
with (
    FIELDTERMINATOR = '',''
  , ROWTERMINATOR = ''\n''
  , lastrow = '+convert(nvarchar(11),@lastline)+'
);';
exec sp_executesql @sql;

select * from #Data

drop table #Data

答案 1 :(得分:0)

如果lastrow选项对您不起作用,请手动删除最后一行并尝试重新运行BulkLoad进程。如果一切正常,请创建VB.NET可执行文件以打开文件,删除最后一行,然后重新保存文件。可以使用Windows任务计划程序安排删除最后一行进程和BulkLoad进程。

https://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html