Sql server 中的bulk insert语句使用-程序员宅基地

技术标签: SQL Server  

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='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)

 

另外这里有一篇文章很详细的总结了使用bulk insert可能会出现的一些换行问题,大家可以参考下:

SQL Server Bulk Insert Row Terminator Issues

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sunwenwu521/article/details/91813050

智能推荐

Synonyms:一个开源的中文近义词工具包_synonyms.nearby-程序员宅基地

文章浏览阅读4.6k次,点赞4次,收藏8次。作者:Synonyms 项目的作者胡小夕是北京邮电大学研究生,目前实习于今日头条 AI LAB。从事自然语言处理方向研究,在智能客服,知识图谱等领域都有相关研究开发经验。工具包技术说明:该中文近义词工具包采用的基本技术是 Word2vec。Synonyms 的安装十分便捷,我们可以直接使用命令 pip install -U synonyms 完成。该工具包兼容 Python 2 和 Python ..._synonyms.nearby

ssm校园快递管理系统-计算机毕设 附源码 50757_基于ssm校园快递领取系统源码-程序员宅基地

文章浏览阅读116次。注册用户管理模块该模块是为所有用户登录设计的,注册用户登录后只能进行自己的普通功能操作(如个人信息修改),管理员登录后有不同的权限,管理员能对整个系统的数据进行管理,主要是用户的登录权限以及用户登录后在系统里的操作权限。寄件信息模块注册用户提交寄件信息后,注册用户和管理员都能在后台查看寄件信息,管理员可以对寄件信息进行审核。快递记录模块管理员来录入快递记录,点击快递录入按钮,依次填写要录入的快递数据,点击提交按钮,将数据提交至数据库,然后刷新快递记录页面,每条数据右边有删除和编辑按钮,来完成相应的_基于ssm校园快递领取系统源码

Automatically Discovering and Learning New Visual Categories with Ranking Statistics (ICLR 2020)-程序员宅基地

文章浏览阅读112次。我们解决了在给定其他类的带标签示例的图像集合中发现新类的问题。这种设置类似于半监督学习,但明显更难,因为新类没有标记的示例。因此,挑战在于利用标记图像中包含的信息来学习通用的聚类模型,并使用后者来识别未标记数据中的新类。在这项工作中,我们通过结合三个想法来解决这个问题:(1)我们认为,使用标记数据的引导图像表示的常见方法只会引入一种不必要的偏差,而这可以通过使用自我监督学习从有标记和无标记数据的联合上从头开始训练表示来避免;(2)利用秩统计量将模型对带标签类的认识转移到对无标签图像的聚类问题上;_automatically discovering and learning new visual categories with ranking st

peerconnection_client demo总流程(一)_peerconnection_client 简化-程序员宅基地

文章浏览阅读1.3k次。总流程如下:_peerconnection_client 简化

关于IPSEC的简单总结_思科ipsec的对称加密和非对称加密说明-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏13次。密码学基础安全三要素:完整性、私密性、不可否认性(合法性)一、完整性:数据没有遭到损坏,或者篡改通过完整性算法进行完整性校验:哈希算法----不可逆算法MD5 SHA例如本地:MD5(原始数据+秘钥)=KEY1原始数据+KEY1 发送到邻居处邻居:MD5(原始信息+本地秘钥)=KEY2若KEY1=KEY2,则表示认证成功。二、私密性:数据通过转换,形成另一种格式(就是转换为让其他..._思科ipsec的对称加密和非对称加密说明

前端——HTML基础_html空心圆-程序员宅基地

文章浏览阅读6k次。目录html基本标签列表标签无序列表有序列表超链接标签a标签假链接表格标签基本表格单元格合并注意事项表单标签【重点】基本介绍form的常见子标签input:输入类型select :选择菜单textarea:文本域通用属性设置默认值其它属性媒体标签html基本标签标题标签<hn></hn> n取值1~6段落标签 段落之间自动进行换行<p></p>粗体标签<b></b>斜体标签<i></i&_html空心圆

随便推点

数据库的基本概念_数据库 基本概念-程序员宅基地

文章浏览阅读1.2w次,点赞20次,收藏120次。1. 数据库的基本概念1.1 什么是数据库数据库(database)是用来组织、存储和管理数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。1.2 常见的数据库及分类市面上的数据库有很多种,最常见的数据库有如下几个:MySQL _数据库 基本概念

makefile 条件判断语句_makefile if-程序员宅基地

文章浏览阅读2.6k次,点赞6次,收藏4次。makefile中支持条件判断语句。可以根据条件的值决定 make 的执行。可以比较两个不同变量或者变量和常量值。条件判断语句只能用于控制 make 实际执行的语句;但是,不能控制规则中命令的执行过程。注意:中间不可以有空格。下一篇介绍函数的定义于调用。_makefile if

arraybuffer操作_JavaScript 之 ArrayBuffer-程序员宅基地

文章浏览阅读299次。JS里的ArrayBuffer还记得某个晚上在做 canvas 像素级操作,发现存储像素的数据格式并不是Array类型,而是ArrayBuffer,心想这是什么鬼?后来查了一些资料,发现自己这半年来的JS是白学了,竟然才知道还有这么个东东。首先,这个 ArrayBuffer 类型化数组,类型化数组是JavaScript操作二进制数据的一个接口。最初为了满足JavaScript与显卡之间大量的、实时..._arraybuffer 写入

前端学习 -- 什么是api_前端api是什么意思-程序员宅基地

文章浏览阅读3.1k次,点赞6次,收藏7次。api是什么API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科说得通俗易懂一些,就是别人写好的代码,或者编译好的程序,拿去使用,就叫做API。你使用了别人代码(或者程序)中的某个函数、类、对象,就叫做使用了..._前端api是什么意思

three.js顶点概念知识点_three.js float32array-程序员宅基地

文章浏览阅读551次。three.js-顶点点let geometry = new THREE.BufferGeometry();let vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 10, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 10, //顶点6坐标]);let attribue = new THREE.B_three.js float32array

论文研读 —— 10. PCA-Kalman: device-free indoor human behavior detection with commodity Wi-Fi (3/3)-程序员宅基地

文章浏览阅读275次。在这篇论文中,我们提出了一种使用无处不在的Wi-Fi检测室内活动的方法,称为PCA-Kalman,并从商用现成的(COTS) Wi-Fi设备中提取CSI信号。进一步地,实验结果显示,在三个不同的测试区域,这种方法的检测率为95%。从图13可以看出,随着窗口大小的增加,三个系统的检测率都在增加,但当窗口大小超过某个设定的阈值时,人员的不同行为状态会导致CSI的时间差异。我们还注意到,除了在所有区域的区域3测试外,PCA取得了出色的结果,因为区域3距离发射机和接收机很远,导致信号中的人员变化不太明显。

推荐文章

热门文章

相关标签