很多时候,需要批量的导数据,可能大家想到的第一反应就是右键数据库->任务->导入导出数据。但是其实微软自身提供的大容量导入导出工具,有bcp, bulkinsert 之类的也是很好用。今天整理一下bcp 的常规用法

首先bcp 的介绍页,请:https://msdn.microsoft.com/zh-cn/library/aa337544(v=sql.120).aspx

首先我们先搞个测试表来做测试

CREATE TABLE [dbo].[t3](
[ID] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[Chinese] [int] NULL,
[Math] [int] NULL
) ON [PRIMARY]
go CREATE TABLE [dbo].[t4](
[ID] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[Chinese] [int] NULL,
[Math] [int] NULL
) ON [PRIMARY]
go USE [Test]
GO INSERT [dbo].[t3] ( [name], [Chinese], [Math]) VALUES ( N'张三', 90, 80)
GO
INSERT [dbo].[t3] ( [name], [Chinese], [Math]) VALUES ( N'李四', 75, 90)
GO
INSERT [dbo].[t3] ( [name], [Chinese], [Math]) VALUES ( N'王五', 68, 100)
GO
INSERT [dbo].[t3] ( [name], [Chinese], [Math]) VALUES (N'赵六', 100, NULL)
GO
INSERT [dbo].[t3] ( [name], [Chinese], [Math]) VALUES ( N'うずまき ナルト ', 59, 80)
GO

创建测试表和数据

1 、首先介绍最简单直接导出文件的方法,直接使用导出字符的方式进行导出导入

--字符串导出
exec sys.xp_cmdshell 'bcp test.dbo.t3 out D:\t3.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 -c'
--采用刚刚导出的文件进行导入
exec sys.xp_cmdshell 'bcp test.dbo.t4 in D:\t3.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 -c'

这个是最基础的写法。如果要在cmd黑屏里面,就执行红色部分即可。

执行完之后,可以在t4里面查到跟t3 一模一样的数据了。

这里有几个地方需要说明一下。 -U user -P pwd 这里是输入用户名和密码,假如在本机上面操作,可以使用-T 来代替。

默认情况下,bcp 采用的是 tab 作为列分割, 回车\换行作为行分割,可能有些表里面存放的数据本身带有 tab 或者 回车的,这样就会影响到数据的导入(导出是肯定没有问题的),

这个时候就需要使用 -t 和 -r 的选项了, -t @@#@  表示使用@@#@ 作为列分割。-r $$% 表示使用 $$%作为行分割。看起来这些符号有点奇葩,但是一般来说,还是建议用不常用的符号作为分割符。避免和平常的数据冲突。

还有一点,对于空值 null ,导出数据会转换成空字符,导入的话空字符会转换成null

2、使用 queryout 方式导出文本数据

exec sys.xp_cmdshell 'bcp "select ID,Name,Math from test.dbo.t3" queryout D:\t3.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 -c' 

这样的写法,只导出来三列,其中Chinese列是没有导出到这个文本的。

PS: queryout 并没有对应的queryin ,所以如果是后续需要重新导入,慎用这种写法

3、使用格式化的文件来导出/导入 数据

除了使用直接导出,还可以使用格式化文件进行导出导入。分成3步处理

--格式化文件生成,导出/导入,非xml格式
exec sys.xp_cmdshell 'bcp test.dbo.t3 format nul -f D:\format.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 -c'
--导出文件
exec sys.xp_cmdshell 'bcp test.dbo.t3 out D:\t3.txt -f D:\format.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123'
--导入文件
exec sys.xp_cmdshell 'bcp test.dbo.t4 in D:\t3.txt -f D:\format.txt -S GINLATOP\MSSQLSERVER2016 -U sa -P 123'

首先第一个语句生成了一个t3的格式化文件,生成的内容是这样纸的

12.0
4
1 SQLCHAR 0 12 "\t" 1 ID ""
2 SQLCHAR 0 100 "\t" 2 name Chinese_PRC_BIN2
3 SQLCHAR 0 12 "\t" 3 Chinese ""
4 SQLCHAR 0 12 "\r\n" 4 Math ""

关于这块的解释,可以戳这里:https://msdn.microsoft.com/zh-cn/library/ms191479(v=sql.120).aspx

这样的好处是有个格式化文件。看起来比较清晰。

4、使用格式化文件来导出\导入数据,步骤差不多。差别就是格式化文件使用的是xml 。具体实践如下

--格式化文件生成,xml格式
exec sys.xp_cmdshell 'bcp test.dbo.t3 format nul -f D:\format.xml -x -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 -c'
--格式化文件导出
exec sys.xp_cmdshell 'bcp test.dbo.t3 out D:\t3.txt -f D:\format.xml -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 '
--格式化文件导入
exec sys.xp_cmdshell 'bcp test.dbo.t4 in D:\t3.txt -f D:\format.xml -S GINLATOP\MSSQLSERVER2016 -U sa -P 123 '

生成的记录就是这个样纸,解释的部分可以戳会之前的那个链接

<?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="\t" MAX_LENGTH="12"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100" COLLATION="Chinese_PRC_BIN2"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="12"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="12"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="ID" xsi:type="SQLINT"/>
<COLUMN SOURCE="2" NAME="name" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Chinese" xsi:type="SQLINT"/>
<COLUMN SOURCE="4" NAME="Math" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>

本次分享到这里

笔记整理之BCP的更多相关文章

  1. 笔记整理之 Bulk Insert

    之前2篇日志整理了BCP大致的用法,这次整理一下它的兄弟 Bulk Insert 的写法以及和bcp那边的结合的用法. 首先,Bulk Insert 语句要在连接了Sql Server 服务器之后才执 ...

  2. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  3. 从0开始学Swift笔记整理(五)

    这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...

  4. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  5. 学习ReactNative笔记整理一___JavaScript基础

    学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...

  6. Deep Learning(深度学习)学习笔记整理系列之(八)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  7. Deep Learning(深度学习)学习笔记整理系列之(七)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(六)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  9. Deep Learning(深度学习)学习笔记整理系列之(四)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

随机推荐

  1. C#基于两种需求向图片添加水印

    使用场景 1.也就是大家经常用的,一般是图片的4个角落,基于横纵坐标来添加. 2.在图片内基于固定位置,文字始终居中.刚开始我基于第一种场景来根据水印汉字的长度来计算坐标,后来发现方法始终不可靠.现在 ...

  2. 20款jQuery 的音频和视频插件

    分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...

  3. React Native at first sight

    what is React Native? 跟据官方的描述, React Native是一套使用 React 构建 Native app 的编程框架. 推出不久便引发了广泛关注, 这也得益于 Java ...

  4. MySQL PXC构建一个新节点只需IST传输的方法

    需求场景:原有的pxc环境数据量已经比较大,新买的服务器要加入此集群中,如何让其用IST的方式传输,而不是SST. PXC传输数据有两种方式: IST: Incremental State Trans ...

  5. MVC学习系列7--下拉框的联动

    [使用场景:两个DropDownList的联动,选择其中一个DropDownList,然后加载数据到另外的一个DropDownList上] 这里,我打算实现的需求是:有两个DropDownList,一 ...

  6. MS SQL 字符拆分存处理

    MS SQL Server没有split()函数,但是我们可以写一个Table-valued Functions定义函数[dbo].[udf_SplitStringToTable] : CREATE ...

  7. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  8. WinFrom 公共控件 Listview 的使用

    Listview绑定数据库数据展示与操作使用  1.拖一个Listview控件到项目中先将视图改为Details 2.编辑列 设置列头  添加columnHeader成员 Text 是显示的名称 3. ...

  9. html中<radio>单选按钮控件标签用法解析及如何设置默认选中

    <input type="radio" name="radio" value="1">单选1 <input type=&q ...

  10. 从零开始学 Java - 数据库连接池的选择 Druid

    我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...