bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。bcp可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。下面将详细讨论如何利用bcp导入导出数据。

  1. bcp的主要参数介绍

bcp共有四个动作可以选择。

(1) 导入。

这个动作使用in命令完成,后面跟需要导入的文件名。

(2) 导出。

这个动作使用out命令完成,后面跟需要导出的文件名。

(3) 使用SQL语句导出。

这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。

(4) 导出格式文件。

这个动作使用format命令完成,后而跟格式文件名。

下面介绍一些常用的选项:

-f format_file

format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。

-x

这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。

-F first_row

指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。

-L last_row

指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。

-c

使用char类型做为存储类型,没有前缀且以"/t"做为字段分割符,以"/n"做为行分割符。

-w

和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。

-t field_term

指定字符分割符,默认是"/t"。

-r row_term

指定行分割符,默认是"/n"。

-S server_name[ /instance_name]

指定要连接的SQL Server服务器的实例,如果未指定此选项,bcp连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。

-U login_id

指定连接SQL Sever的用户名。

-P password

指定连接SQL Server的用户名密码。

-T

指定bcp使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。

-k

指定空列使用null值插入,而不是这列的默认值。

  1. 如何使用bcp导出数据

(1) 使用bcp导出整个表或视图。

bcp AdventureWorks.sales.currency out c:/currency1.txt -c -U"sa" -P"password" --使用密码连接或bcp AdventureWorks.sales.currency out c:/currency1.txt -c -T --使用信任连接

下面是上述命令执行后的输出结果

Starting copy...

105 rows copied.

Network packet size (bytes): 4096

Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)

下面是currency1.txt的部分内容

AED Emirati Dirham 1998-06-01 00:00:00.000

AFA Afghani 1998-06-01 00:00:00.000

... ... ...

... ... ...

ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000

在使用密码登录时需要将-U后的用户名和-P后的密码加上双引号。

注:bcp除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行bcp。如上述第一条命令可改写为

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency out c:/currency1.txt -c -U"sa" -P"password"'

执行xp_cmdshell后,返回信息以表的形式输出。为了可以方便地在SQL中执行bcp,下面的命令都使用xp_cmdshell执行bcp命令。

(2) 对要导出的表进行过滤。

bcp不仅可以接受表名或视图名做为参数,也可以接受SQL做为参数。通过SQL语句可以对要导出的表进行过滤,然后导出过滤后的记录。

EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:/currency2.txt -c -U"sa" -P"password"'

bcp还可以通过简单地设置选项对导出的行进行限制。

这条命令使用了两个参数-F 10和-L 13,表示从SE

EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:/currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'

LECT TOP 20 * FROM AdventureWorks.sales.currency所查出来的结果中取第10条到13条记录进行导出。

  1. 如何使用bcp导出格式文件

bcp不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过bcp命令根据表、视图自动生成格式文件。

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:/currency_format1.fmt -c -T'

上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。

9.0

3

1 SQLCHAR 0 6 "/t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS

2 SQLCHAR 0 100 "/t" 2 Name SQL_Latin1_General_CP1_CI_AS

3 SQLCHAR 0 24 "/r/n" 3 ModifiedDate

这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。

bcp还可以通过-x选项生成xml格式的格式文件。

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:/currency_format2.fmt -x -c -T'

xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。

  1. 如何使用bcp导入数据

bcp可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。

SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency

将数据导入到currency1表中

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -c -T'

导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -c -F 10 -L 13 -T'

在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。

使用普通的格式文件

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -F 10 -L 13 -c -f c:/currency_format1.fmt -T'

使用xml格式的格式文件

EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -F 10 -L 13 -c -x -f c:/currency_format2.fmt -T'

总结

bcp命令是SQL Server提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过xp_cmdshell在SQL语句中执行,通过这种方式可以将其放到客户端程序中(如delphi、c#等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。

SQL SERVER BCP导入导出的更多相关文章

  1. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  2. 数据库SQL Server DAC 导入导出数据到SQL Azure问题

    对Export data-tier application报错的处理 Error:SQL71564 这个问题是数据库中一些对象如MS_Description,MS_DiagramPane1不支持DAC ...

  3. SQL Server数据导入导出的几种方法

    在涉及到SQL Server编程或是管理时一定会用到数据的导入与导出, 导入导出的方法有多种,结合我在做项目时的经历做一下汇总: 1. SQL Server导入导出向导,这种方式是最方便的. 导入向导 ...

  4. SQL Server使用导入导出向导导入超过4000个字符的字段的数据

    在使用SQL Server导入导出向导导入数据的时候,我们经常会碰到某个单元格的数据超长而被截断报错的情况.本文针对这种场景给出相应的解决方案.   环境描述:SQL Server 2012,文件源: ...

  5. sql server数据导入导出方法统计

    常用的数据量不是很大的情况的几种方法:转载地址 http://www.cnblogs.com/changbluesky/archive/2010/06/23/1761779.html 大数据量的推荐导 ...

  6. SQL Server BCP 资料导入导出

    SQL Server BCP 导入导出使用 Bcp 导出导入数据高效,比使用SQL Server Management Stdio 提供的数据库导出导入要高效因为sql server 也没有提供提供类 ...

  7. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  8. SQL Server 将数据导出为XML和Json

    有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...

  9. SQL Server 2005导入Excel表问题

    EXCEL导入到SQL Server经常出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项” 原因: SQL Server的导入导出为了确定数据表的字段类型,取excel文件的前8行来判别. ...

随机推荐

  1. 实现Runable接口

    步骤 定义一个实现Runable接口的类,在类中实现run()方法(线程执行事件的方法).创建一个上述类的对象:Thread t=new Thread(new MyThreadt.start());调 ...

  2. mysql 5.7 安装配置及无法启动的问题解决

    (用这篇配置就能正常配置成功) mysql 免安装版配置方法: https://www.jb51.net/article/134452.htm 参考:https://blog.csdn.net/qq_ ...

  3. xml文件中 xmlns xmlns:xsi 等解释

    http://bbs.csdn.NET/topics/390751819 maven 的 pom.xml 开头是下面这样的 <project xmlns="http://maven.a ...

  4. JavaScript json loop item in array

    Iterating through/Parsing JSON Object via JavaScript 解答1 Your JSON object is incorrect because it ha ...

  5. db2表结构导出导入,数据库备份

    1.新增用户组.用户和查看所有用户: 新增系统用户组: #groupadd jldb //增加用户组jldb 需使用root权限 useradd jldb -g jldb //将新增用户赋值到jldb ...

  6. Linux下GCC去除调试信息

    如果不去除调试信息,直白点说基本上是把代码公开了,不要带-g参数,还有就是需要带 -O2 -fvisibility=hidden -s 生成程序后可以用命令strip进一步去除不需要的符号 strip ...

  7. 技术文档翻译-------glove readme(1)

    Package Contents To train your own GloVe vectors, first you tools. An example is included in demo.sh ...

  8. python蒙特卡洛脚本模拟—挑战者号爆炸概率

     python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  9. 三、Jmeter生成HTML报告

    1.执行jmeter -n -t [接口脚本地址] -l [test.jtl地址] -e -o [报告输出地址] 例如:jmeter -n -t C:\chushujin\youxinscript\j ...

  10. 中国MOOC_零基础学Java语言_第7周 函数_1分解质因数

    第7周编程题 查看帮助 返回   第7周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...