背景
首先,我现在有一个文本文件user.txt,文本的内容是如下格式的:
username1 # password1 # email1
username2 # password2 # email2
username3 # password3 # email3
然后,我想将这个user.text文件中的内容导入sqlserver数据库中,数据库名称为:db,表名为:userinfo。并且为每一行添加一个自增长主键列。所以我创建的userinfo表结构如下:
create table userinfo( id int identity(1,1) primary key, username varchar(50) not null, [password] varchar(50) not null, email varchar(50) not null )
问题
在user.txt中没有id列,那么如何在导入数据库的时候添加呢?我使用如下bulk insert命令是不行的
bulk insert userinfo from 'D:\user.txt' with( FORMATFILE = 'C:\BCPFORMAT.xml', fieldterminator = ' # ', rowterminator = '\n' )
BCPFORMAT.xml内容如下:
<?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=" # " /> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=" # " /> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\n" /> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="username" xsi:type="SQLVARYCHAR"/> <COLUMN SOURCE="2" NAME="password" xsi:type="SQLVARYCHAR"/> <COLUMN SOURCE="3" NAME="email" xsi:type="SQLVARYCHAR"/> </ROW> </BCPFORMAT>
如果我数据库表结构中没有那个id列,那么通过如下bulk insert命令成功导入
bulk insert userinfo from 'D:\user.txt' with( fieldterminator = ' # ', rowterminator = '\n' )
最后,我想我的问题应该描述的挺清楚了,求大家帮帮忙,这个东西弄了一天没有搞明白。谢谢。
自己解决了,
--导入
INSERT INTO userinfo([username],[password],[email])
SELECT * FROM OPENROWSET(
BULK 'D:/user.txt',
FORMATFILE='d:/BCPFORMAT.xml'
--, FIRSTROW=2
) AS T;
参考其中的sql server 2005的解决方法。但是感觉这已经不是BULK INSERT了啊,不知道效率是否跟BULK INSERT一样
BULK INSERT userinfo FROM 'd:\user.txt' WITH ( KEEPIDENTITY, FORMATFILE='c:\BCPFORMAT.Xml', fieldterminator='#', rowterminator='\n' );
你这种已经试过了,不行。运行的sql,他还是会试图将记录的第一个字段username1插入到id列中,因此最后报错为“在将 varchar 值 'username1' 转换成数据类型 int 时失败。”
我自己解决的方法是通过
INSERT INTO userinfo([username],[password],[email])
指定了需要插入的列,就是不知道bulk insert有没有指定插入列的功能