bulk insert 语句末尾换行问题,急!急!!急!!!求高手解答

鲁某某 2013-11-06 11:01:24
本人想把TXT文件导入数据库中
aa.txt文件内容为:
A;1008000138;299船;20027834;钱 长城;20130614;99991231;1008000003;
A;1008000138;299船;20027834;钱 长城;20130614;99991231;1008000005;

创建的表结构为:
CREATE TABLE [dbo].[people](
[s_type] [varchar](50) NOT NULL,
[c_id] [int] NOT NULL,
[c_name] [varchar](50) NOT NULL,
[p_id] [int] NOT NULL,
[p_name] [varchar](50) NOT NULL,
[b_date] [date] NOT NULL,
[e_date] [date] NOT NULL,
[l_id] [nvarchar](max) NOT NULL
)
执行sql语句
bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
消息 4832,级别 16,状态 1,第 1 行
大容量加载: 在数据文件中遇到意外的文件结尾。
消息 7399,级别 16,状态 1,第 1 行
链接服务器 "(null)" 的 OLE DB 访问接口 "BULK" 报错。提供程序未给出有关错误的任何信息。
消息 7330,级别 16,状态 2,第 1 行
无法从链接服务器 "(null)" 的 OLE DB 访问接口"BULK"提取行。

但如果把SQL语句改成
bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator='\n')
可以插入多条数据,但最后一个字段多一个“;”,求大神解答如何才能去掉这个分号
...全文
398 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复
找不到方法. bulk insert之后,手工修正一下最后一个字段的问题.

bulk insert people from 'F:\aa.txt' 
with(fieldterminator=';',
     rowterminator=';\r',
     kilobytes_per_batch=5000)

update people 
 set l_id=left(l_id,len(l_id)-1)
 where right(l_id,1)=N';'

select * from people
鲁某某 2013-11-06
  • 打赏
  • 举报
回复
引用 13 楼 ap0405140 的回复:
[quote=引用 12 楼 JavaBoos 的回复:] 我的也是2008R2的,就是多个分号呢。
第二行最后一个字段值1008000005;后面再回车一下,保存重试就行了.[/quote] 这个文件是不可改的,不能出现人为的处理,只能通过智能化,是另外一个软件导出的文件。 刚才我回车一下,再试了一下还是不行。还带分号
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复
引用 12 楼 JavaBoos 的回复:
我的也是2008R2的,就是多个分号呢。
第二行最后一个字段值1008000005;后面再回车一下,保存重试就行了.
鲁某某 2013-11-06
  • 打赏
  • 举报
回复
引用 10 楼 yupeigu 的回复:
[quote=引用 9 楼 ap0405140 的回复:] [quote=引用 8 楼 yupeigu 的回复:] [quote=引用 7 楼 ap0405140 的回复:] 在SQL2008R2测试正常的喔,

bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
嗯是正常的,但好像导进去 多了分号[/quote] 最后字段结尾没有分号喔,是正常的.[/quote] 我的也是2008R2的,输出是这样的,最后多了一个分号:
s_type	c_id	c_name	p_id	p_name	b_date	e_date	l_id
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000003
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000005;
[/quote] 我的也是2008R2的,就是多个分号呢。
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 5 楼 JavaBoos 的回复:
嗯,这样处理,我已经处理完了,不过方式跟你不一样。 这个bulk insert语句是有把分号和回车键一起算作行的功能的,不过我不知道因为什么分号去不下去。我就想着把分号去下去。
我知道是什么问题了,原来你的数据,应该在最后,也就是第二行的1008000005;后面再回车一下,就行了: A/1008000138/299船/20027834/钱 长城/20130614/99991231/1008000003; A/1008000138/299船/20027834/钱 长城/20130614/99991231/1008000005; 效果:
truncate table people
 
bulk insert people from 'c:\aa.txt' with(fieldterminator='/',rowterminator='\;\n')
 
select * from people
/*
s_type	c_id	c_name	p_id	p_name	b_date	e_date	l_id
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000003
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000005
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 9 楼 ap0405140 的回复:
[quote=引用 8 楼 yupeigu 的回复:] [quote=引用 7 楼 ap0405140 的回复:] 在SQL2008R2测试正常的喔,

bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
嗯是正常的,但好像导进去 多了分号[/quote] 最后字段结尾没有分号喔,是正常的.[/quote] 我的也是2008R2的,输出是这样的,最后多了一个分号:
s_type	c_id	c_name	p_id	p_name	b_date	e_date	l_id
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000003
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000005;
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复
引用 8 楼 yupeigu 的回复:
[quote=引用 7 楼 ap0405140 的回复:] 在SQL2008R2测试正常的喔,

bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
嗯是正常的,但好像导进去 多了分号[/quote] 最后字段结尾没有分号喔,是正常的.
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 7 楼 ap0405140 的回复:
在SQL2008R2测试正常的喔,

bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
嗯是正常的,但好像导进去 多了分号
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复
在SQL2008R2测试正常的喔,

bulk insert people from 'F:\aa.txt' with(fieldterminator=';',rowterminator=';\n')
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 5 楼 JavaBoos 的回复:
嗯,这样处理,我已经处理完了,不过方式跟你不一样。 这个bulk insert语句是有把分号和回车键一起算作行的功能的,不过我不知道因为什么分号去不下去。我就想着把分号去下去。
我又试了一下,这个分号如果作为字段分隔符是没问题的,但是好像不支持作为行分隔符。 我把aa.txt中修改为这样,还是不行: A/1008000138/299船/20027834/钱 长城/20130614/99991231/1008000003; A/1008000138/299船/20027834/钱 长城/20130614/99991231/1008000005;
鲁某某 2013-11-06
  • 打赏
  • 举报
回复
嗯,这样处理,我已经处理完了,不过方式跟你不一样。 这个bulk insert语句是有把分号和回车键一起算作行的功能的,不过我不知道因为什么分号去不下去。我就想着把分号去下去。
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
引用 3 楼 JavaBoos 的回复:
我的这个文件,是另外一个软件导出的固定格式,每一条数据下都有;号,这个不能去。要不我只能把分号带进数据库中,然后再对数据进行修改
嗯 是呀,先导进去,然后用我上面的代码,update一下就好了:

CREATE TABLE [dbo].[people](
[s_type] [varchar](50) NOT NULL,
[c_id] [int] NOT NULL,
[c_name] [varchar](50) NOT NULL,
[p_id] [int] NOT NULL,
[p_name] [varchar](50) NOT NULL,
[b_date] [date] NOT NULL,
[e_date] [date] NOT NULL,
[l_id] [nvarchar](max) NOT NULL
)
  
--truncate table people

bulk insert people from 'c:\aa.txt' with(fieldterminator=';',rowterminator='\n')

select * from people

--把分号去掉
update people
set l_id = left(l_id,len(l_id)-1)
/*
s_type	c_id	c_name	p_id	p_name	b_date	e_date	l_id
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000003
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000005
*/
鲁某某 2013-11-06
  • 打赏
  • 举报
回复
我的这个文件,是另外一个软件导出的固定格式,每一条数据下都有;号,这个不能去。要不我只能把分号带进数据库中,然后再对数据进行修改
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
能不能把每一行中的分号给去掉呢? 要是不去掉,那就只能在bulk insert 后,通过update来替换了:

CREATE TABLE [dbo].[people](
[s_type] [varchar](50) NOT NULL,
[c_id] [int] NOT NULL,
[c_name] [varchar](50) NOT NULL,
[p_id] [int] NOT NULL,
[p_name] [varchar](50) NOT NULL,
[b_date] [date] NOT NULL,
[e_date] [date] NOT NULL,
[l_id] [nvarchar](max) NOT NULL
)
  
--truncate table people

bulk insert people from 'c:\aa.txt' with(fieldterminator=';',rowterminator='\n')

select * from people

update people
set l_id = left(l_id,len(l_id)-1)
/*
s_type	c_id	c_name	p_id	p_name	b_date	e_date	l_id
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000003
A	1008000138	299船	20027834	钱 长城	2013-06-14	9999-12-31	1008000005
*/
LongRui888 2013-11-06
  • 打赏
  • 举报
回复
主要是你的文件,每一行的最后都多了一个分号; 导致的

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧