很多时候,需要批量的导数据,可能大家想到的第一反应就是右键数据库->任务->导入导出数据。但是其实微软自身提供的大容量导入导出工具,有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. ssh整合问题总结--使用HibernateTemplate实现数据分页展示

    在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完 ...

  2. (二十一)WebGIS中鹰眼的实现思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 鹰眼功能是WebGIS中的一种常见功能,利用一些开源的框架实现 ...

  3. Ubuntu实现树莓派交叉编译

    一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...

  4. 自己实现简单的AOP(一)简介

    AOP 和 OOP,在我看来是两种相辅相成的技术,作为OOP的补充,AOP 有着自己特殊的应用场景. 假设,我们需要在Service层实现以下几项基本功能: /// <para>1.自动管 ...

  5. 如何使用Dubbo服务和集成Spring

    Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo是一个 ...

  6. 配置Java SSL 访问网站证书

    最近在开发 Java 访问 Azure ServiceBus 时遇到SSL证书问题,导致JAVA报错,不能正常访问,报错信息如下: javax.net.ssl.SSLException: Connec ...

  7. Linux(五)__硬盘分区

    Linux中的文件管理机制是一种叫挂载和卸载的方式使用分区中的文件. 1.硬盘分区的概念 概述:首先我们要对硬盘分区的基本概念进行一些初步的了解,硬盘的分区主要分为基本分区(Primary Parti ...

  8. Apache Lucene(全文检索引擎)—搜索

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...

  9. 原生js使用forEach()与jquery使用each遍历数组,return false 的区别

    原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24]; $.e ...

  10. O365(世纪互联)SharePoint 之站点个性化

    前言 上一篇文章中,我们简单介绍了如何使用O365中SharePoint Online文档库,SharePoint Online的优点就是提供给我们很多非常方便开箱即用的功能,让我们快速的搭建站点,方 ...