Sql server bulk insert语句:将数据从文件导入数据库中

Sql server 的bulk insert语句可以高效的导入大数据量的平面文件(txt,csv文件)到数据库的一张表中

--创建虚拟表
create table #tmptable
(
    Date varchar(10),
    Receipt varchar(50),
    Description varchar(100),
    [Card_Member] varchar(50),
    [Account] varchar(17),    
    Amount varchar(20)
)
--bulk insert插入数据
bulk insert #tmptable
from 'C:\Users\example.xls'
with (FieldTerminator='\t', RowTerminator = '\n')
go

其中:
#tmptable是数据库表的名字,注意#+表名表示是一张临时表,不会出现在实体表中

'C:\Transactions\example.xls’是导入平面文件的地址,

fieldterminator指定平面文件中列的分隔符是什么,

rowterminator指定平面文件中行的结束符是什么。

还可以使用FIRSTROW和LASTROW限制行数。如下COPY前三行:

bulk insert test
from 'f:\test.txt'
with
(fieldterminator=',',
rowterminator='\n',
FIRSTROW =1,
LASTROW=3)

如果要把平面文件数据导入到数据库表中,平面文件只有3个字段,数据库表有7个字段,怎么把平面文件字段的对应到表的字段,如何用bulk insert来实现?

--数据库表 userinfo
CREATE TABLE userinfo
(
    id INT identity,
    userName varchar(20),
    pass varchar(20),
    address varchar(100),
    phone varchar(20),
    email varchar(128),
    registerTime datetime
)
--平面文件数据是F:\test.txt的信息
userName,address,phone 
hua,湖南,5971898
jan,重庆,2334512
wang, 北京, 100201

先在G盘存放一个格式化xml文件G:\format.xml



 
  
  
  
 
 
  
  
  
 

然后使用bulk insert语句时,采用FORMATFILE参数指定该format.xml文件

BULK INSERT userinfo
    FROM 'F:\test.txt'
WITH
(
    FORMATFILE = 'G:\format.xml',
    FIELDTERMINATOR=',',
    ROWTERMINATOR='\n',
    FIRSTROW = 2
)

这样bulk insert语句就会按照format.xml文件中的列映射,将平面文件F:\test.txt的三列数据,依次插入到表userinfo的userName、address、phone这三个字段上了

疑难解答

1.最好使用十六进制ASCII码来声明ROWTERMINATOR
有时候当我们的txt或csv文件的文件头没有声明文件的编码方式(比如txt或csv文件是936-GBK或者UTF-8等编码方式,但是在其文件头没有声明)时,会导致bulk insert语句的ROWTERMINATOR参数失效,比如当我在导入一个test.txt文件是936-GBK编码方式的时候,我发现明明文件中的换行符是’\n’,但是当我声明ROWTERMINATOR=’\n’的时候根本不起作用,bulk insert老是找不到文件中的换行符进而报错。

然后我通过网上查资料发现,原来bulk insert的ROWTERMINATOR参数,可以使用十六进制ASCII码来表示换行符是什么。比如’\n’的ASCII码是十进制12,十六进制0A,那么我们可以在bulk insert语句中声明0x0a来作为ROWTERMINATOR表示换行符’\n’,如下所示:

BULK INSERT userinfo
    FROM 'F:\test.txt'
WITH
(
    FIELDTERMINATOR='|',
    ROWTERMINATOR='0x0a',
    FIRSTROW =1,
    LASTROW=1000,
    CODEPAGE='936'
)

实验发现当我用十六进制ASCII码声明bulk insert的ROWTERMINATOR参数后,sql server成功识别出了文件中每一行结束的位置。同样如果换行符是’\r’,那么我们可以声明ROWTERMINATOR为十六进制ASCII码0x0d。所以当你使用常规字符(例如’\n’、’\r’等)来给bulk insert的ROWTERMINATOR参数赋值不起作用的时候,你可以尝试使用字符的十六进制ASCII码来给ROWTERMINATOR参数赋值,bulk insert的ROWTERMINATOR参数可以根据十六进制ASCII码准确识别出数据文件中的换行符。

2.使用CODEPAGE参数声明文件的编码方式

CODEPAGE参数可以声明txt或csv文件的编码方式是什么,有时候bulk insert无法识别出导入文件的编码方式,会导致从文件导入的数据是乱码,这时候如果我们知道文件的编码方式,就可以使用CODEPAGE参数告诉bulk insert文件使用的是什么编码,从而避免数据导入到数据库后变为乱码。比如上面的sql中我们就用CODEPAGE参数声明了导入文件的编码是936(GBK)

你可能感兴趣的:(SQL,sqlserver,sql)