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

智能推荐

一个好看的Hexo主题,BFHUI_hexo beautiful-程序员宅基地

文章浏览阅读378次。CN Posthttps://blog.bfh.ink/?p=78AnnouncementThis theme is based on the enhanced version of the Argon theme, there is no plagiarism, the copyright belongs to both parties!Declaration (bug)Currently does not support Markdown’s code insertion metho_hexo beautiful

Springboot使用Gradle打war包_springboot gradle war 完整配置-程序员宅基地

文章浏览阅读964次。1、添加 apply plugin: ‘war’2、 添加依赖providedRuntime(‘org.springframework.boot:spring-boot-starter-tomcat’)3、修改启动类:继承SpringBootServletInitializer@SpringBootApplication@ImportAutoConfiguration({ AppAutoConfiguration.class, AppRestSwaggerConfiguration.clas_springboot gradle war 完整配置

HTML小游戏7 —— 《罗斯魔影》魔法消除游戏(附完整源码)_h5消除小游戏源码-程序员宅基地

文章浏览阅读6.4k次,点赞57次,收藏52次。100个H5游戏专栏 目前已有100+小游戏,源码在持续更新中,前200位订阅限时优惠,先到先得。 订阅专栏后可阅读100个HTML小游戏文章;还可私聊进前端/游戏制作学习交流群;领取一百个小游戏源码。_h5消除小游戏源码

CPM-LFM信号及其干扰技术-程序员宅基地

文章浏览阅读196次。CPM-LFM信号及其干扰技术_cpm-lfm

Exception starting filter struts2 java.lang.ClassNotFoundException: org.apache.-程序员宅基地

文章浏览阅读196次。[code="java"]org.apache.catalina.core.StandardContext filterStart严重: Exception starting filter struts2java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExec..._严重: exception starting filter struts2 java.lang.classnotfoundexception: or

el-table中内置输入框,并且可添加删除_table里面加输入框-程序员宅基地

文章浏览阅读323次。2 data中定义数据。_table里面加输入框

随便推点

基于k8s+docker的高可用集群_xlirh-程序员宅基地

文章浏览阅读2.1k次。它允许你在同一个集群中托管多个应用程序, 并使用统一的入口(域名)来访问它们,而不需要为每个应用程序创建单独的域名和负载均衡器。这可以简化整体的架构和管理,并提高灵活性。模拟k8s在生产中的使用,通过k8s管理web集群,nfs保持前端页面一致性,并且搭建harbor仓库满足自身需求,使用Prometheus监控集群性能,让集群保持高可用。Ansible 的主要意义在于简化和自动化系统管理、配置管理和应用程序部署,从而提高效率、降低风险,并允许基础设施即代码的实践,有助于现代化的运维管理。_xlirh

设置QListView中的QScrollBar样式表_qllistview 滚动条样式-程序员宅基地

文章浏览阅读4k次。刚开始我只是用简单的qss语句设置QScrollBar,居然完全不起作用!_qllistview 滚动条样式

CSS3中支持滤镜效果的实现方法_css加颜色滤镜-程序员宅基地

文章浏览阅读88次。其中,CSS3提供了一种强大的功能,即通过使用滤镜(Filter)效果来改变HTML元素的外观。滤镜可以应用于图像、文字和其他HTML元素,以实现各种视觉效果,例如模糊、饱和度调整、颜色变换等。属性和各种滤镜函数,我们可以轻松地实现模糊、亮度调整、对比度调整、灰度转换、色相旋转、颜色反转等各种视觉效果。在使用滤镜效果时,建议进行兼容性测试,并提供合适的回退方案,以确保在不支持滤镜效果的浏览器中,元素仍然能够显示正常。属性来应用滤镜效果。总结起来,CSS3的滤镜功能为开发人员提供了丰富的样式选择和效果。_css加颜色滤镜

差分进化算法用c语言实现,python 实现差分进化算法-程序员宅基地

文章浏览阅读270次。对于种群优化算法来说,最著名的为粒子群算法、遗传算法及差分进化算法,在前面的博客中实现了其中基本型。应在用C语言编写的运行速度快,但是Python近年来越来越流行,所以蟒蛇实现差分进化算法,通过函数测试运行很快速。主要是用到了numpy库来实现,绘图显示使用的是matplotlib库。差分进化算法总的有四步骤:(1)种群初始化(2)变异操作(3)交叉操作(4)贪婪选择操作 # -*- coding..._差分进化算法的语言处理

jsp + oracle 排序分页 高效sql语句_jsp排序语句-程序员宅基地

文章浏览阅读1k次。oracle 分页1. 最好还是利用分析函数row_number() over ( partition by col1 order by col2 )比如想取出100-150条记录,按照tname排序select tname,tabtype from ( select tname,tabtype,row_number() over ( order by tnam_jsp排序语句

晶体最全介绍_晶体串阻-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏38次。晶体最全面的介绍晶体振荡器电路由反相放大器(显示为反相器),反馈电阻,两个电容和晶体组成。工作时,晶体和电容形成一个pi滤波器为内部放大器提供180度相移,保持振荡器锁定在指定频率。振荡的产生通过注入由噪声和/或瞬态电源响应组成的能量来实现振荡器启动。晶体振荡器由反馈网络和放大器或增益元件组成。巴克豪森稳定性准则振荡器背后的原理是满足巴克豪森条件的正反馈回路:如果闭环增益大于1且总相..._晶体串阻