首页 新闻 会员 周边 捐助

Sql Server中使用bulk insert批量导入,如何添加一个标识列

0
悬赏园豆:10 [已关闭问题] 关闭于 2012-06-11 10:38

背景

首先,我现在有一个文本文件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'
)

 

最后,我想我的问题应该描述的挺清楚了,求大家帮帮忙,这个东西弄了一天没有搞明白。谢谢。

xwdreamer的主页 xwdreamer | 初学一级 | 园豆:144
提问于:2012-06-08 19:20
< >
分享
所有回答(2)
0

自己解决了,

--导入
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一样

xwdreamer | 园豆:144 (初学一级) | 2012-06-08 19:50
0
BULK INSERT userinfo
   FROM 'd:\user.txt'
   WITH (
      KEEPIDENTITY,
      FORMATFILE='c:\BCPFORMAT.Xml',
      fieldterminator='#',
      rowterminator='\n'
);
gunsmoke | 园豆:3592 (老鸟四级) | 2012-06-09 07:13

你这种已经试过了,不行。运行的sql,他还是会试图将记录的第一个字段username1插入到id列中,因此最后报错为“在将 varchar 值 'username1' 转换成数据类型 int 时失败。”

我自己解决的方法是通过

INSERT INTO userinfo([username],[password],[email]) 

指定了需要插入的列,就是不知道bulk insert有没有指定插入列的功能

支持(0) 反对(0) xwdreamer | 园豆:144 (初学一级) | 2012-06-09 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册