18.2 使用格式化文件跳过表列
http://scz.617.cn/misc/201104081240.txt
Q:
假设d:\some.txt中有如下内容:
line1 line2 line3
现在想用bulk insert将之批量导入一个表中:
create table foo(id int identity,line varchar(8000)) bulk insert foo from 'd:\some.txt' select * from foo
原始需求是给每一行增加一个id字段,但上述bulk insert命令失败了。下面这样可 以成功:
create table foo(line varchar(8000)) bulk insert foo from 'd:\some.txt' select * from foo
但这不符合原始需求。
A: scz@nsfocus
以MS SQL Server 2005为例。假设已经创建了foo表:
use tempdb create table foo(id int identity,line varchar(8000))
假设当前OS用户是Administrator,可以使用集成安全性连接到数据库。执行如下命 令:
bcp.exe tempdb.dbo.foo format nul -n -T -x -f foo.xml
生成foo.xml如下:
--------------------------------------------------------------------------
在foo.xml基础上修改出一个与some.txt相匹配的some.xml:
--------------------------------------------------------------------------
insert into foo( line ) select line from openrowset( bulk 'd:\some.txt', formatfile='d:\some.xml' ) as temp select * from foo
这会自动设置id字段的值,从1开始。如果"delete from foo"之后再次 "insert into foo",id不再从1开始,而是在原最大值基础上继续递增。若希望id从 1开始,目前我能想到的办法就是"drop table foo"之后重来。
A: scz@nsfocus
前面用的是XML格式的格式化文件,另有一种TXT格式的格式化文件:
bcp.exe tempdb.dbo.foo format nul -n -T -f foo.fmt
在foo.fmt基础上修改出一个与foo表、some.txt相匹配的some.fmt:
^^^^^^^ ^
不能是SQLVARYCHAR 该值与foo表结构对应,从1计
bulk insert foo from 'd:\some.txt' with ( formatfile='d:\some.fmt' ) select * from foo
A: zhouzhen@nsfocus 2011-04-11 14:30
可以不用格式化文件,有更省事的办法:
drop table foo create table foo(line nvarchar(4000)) bulk insert foo from 'c:\boot.ini' alter table foo add id int identity(1,1) select * from foo