Sql server bulk insert
Bulk Insert
Sql server 的bulk insert语句可以高效的导入大数据量的平面文件(txt,csv文件)到数据库的一张表中,其用法如下:
bulk insert test
from 'f:\test.txt'
with
(fieldterminator=',',
rowterminator='\n')
其中"test"是数据库表的名字,"f:\test.txt"是导入平面文件的地址,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
<?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="," MAX_LENGTH="20" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="20" COLLATION="Chinese_PRC_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="userName" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="address" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="phone" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
然后使用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=''
)
实验发现当我用十六进制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)
另外这里有一篇文章很详细的总结了使用bulk insert可能会出现的一些换行问题,大家可以参考下:
SQL Server Bulk Insert Row Terminator Issues
Sql server bulk insert的更多相关文章
- SQL Server Bulk Insert批量数据导入
SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...
- 从一个Bug说开去--解决问题的思路,Linked Server, Bulk Insert, DataTable 作为参数传递
声名— 部分内容为杜撰,如有雷同,不胜荣幸! 版权所有,如要引用,请标明出处! 如果打赏,请自便! 1 背景介绍 最近一周在忙一个SQL Server 的Bug,一个简单的Bug,更新两张 ...
- SQL Server中INSERT EXEC语句不能嵌套使用(转载)
问: I have three stored procedures Sp1, Sp2 and Sp3.The first one (Sp1) will execute the second one ( ...
- SQL Server 强行Insert包含自增列值的记录
SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES ( ...
- SQL Server 基本INSERT语句
1.基本INSERT语句,单行插入 如果没有列出列,则使一一对应. 2.多行插入 3.INSERT INTO ... SELECT 语句 要插入的语句是从其他表中查询出来的. 注意:数据类型得相同或者 ...
- sql server导出insert语句
在所需要导出数据库上右键 选择[任务] 然后选择[生成脚本] 选择数据库,点击下一步到[数据脚本选项] 编写数据的脚本 选择为true 这一步很重要 下一步选择要导出的对象 下一步选择表 点击完成 ...
- sql server vs mysql
1.中文: my.ini [mysqld] character-set-server=utf8 character-set-client=utf8 data\testdb\db.opt default ...
- ms sql server 在abator生成的 insert 无法获取插入 id 的原因
<insert id="abatorgenerated_insert" parameterClass="net.xxxxxl.dataobject.Users&qu ...
- SQL SERVER BCP的用法
转自:https://www.cnblogs.com/fishparadise/p/4809014.html 前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储 ...
随机推荐
- 快速选择算法/Select 寻找第k大的数
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...
- MutationObserver DOM变化的观察
简单的给MutationObserver做个测试及总结笔记. MutationObserver,window上的一个(构造)函数,可以通过其创建的观察者(观察对象)达到观察DOM的变化的效果. 可适用 ...
- JAVA进阶之路(一)
初学的大三奋斗者,fighting!!! 下面是进阶之路 Java平台和语言最开始只是SUN公司在1990年12月开始研究的一个内部项目.SUN公司的一个叫做帕特里克·诺顿的工程师被自己开发的C和C语 ...
- 【区块链Go语言实现】Part 2:工作量证明机制POW
0x00 介绍 在上一篇文章中,我们建立了一个非常简单的数据结构,它是区块链数据库的本质.并且,我们实现了以类似链条关系的方式向其中添加区块的功能:每个区块都会链接到前一区块.然而,我们实现的区块链有 ...
- java web 手动部署项目步骤
java Web 手动部署项目步骤 1 在tomcat下面的webapps下面建立需要部署的文件夹(eg:demo);2 在demo下建立 WEB-INF WETA-INF src 文件夹;3 在sr ...
- spring boot整合双持久层框架jpa、mybatis
公司之前用的是spring boot + jpa,但由于jpa无法完美的解决某些动态查询问题,就使用的jdbcTemplate 动态封装SQL,由于代码相对复杂,可读性差,现准备再引入mybatis. ...
- UVa 514 Rails(栈的应用)
题目链接: https://cn.vjudge.net/problem/UVA-514 /* 问题 输入猜测出栈顺序,如果可能输出Yes,否则输出No 解题思路 貌似没有直接可以判定的方法,紫书上给出 ...
- [转]Magento刷新索引的几种方法
本文转自:https://blog.csdn.net/IT_Wallace/article/details/78513951 在数据表中经常会使用索引,下面简单介绍一下索引的利弊: 创建索引可以大大提 ...
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
public long getSDTotalSize() { /*获取存储卡路径*/ File sdcardDir= Environment.getExternalStorageDirectory() ...
- [日常] Go语言圣经-示例: 并发的目录遍历习题
练习 8.9: 编写一个du工具,每隔一段时间将root目录下的目录大小计算并显示出来. package main import ( // "filepath" "fla ...