SQL Server中bcp命令的用法以及数据批量导入导出

http://www.cnblogs.com/xwdreamer/archive/2012/08/22/2651180.html

我这边使用  xp_cmdshell 简单 备份一个表的方法:

exec xp_cmdshell 'bcp cwbasemi70.lcmi709999.zwkmzd2017 out c:\zwkmzd2007.dat -Ulcmi709999 -Test6530 -S 10.24.160.71 -c'

# 其实不需要 -S 来表名数据库 因为 sqlcmd 已经连接过去了. 

0.参考文献:

SQL Server BCP使用小结

bcp Utility

某社区600万用户数据导入MYSQL、MSSQL、Oracle数据库方法

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

1.bcp命令参数解析

bcp命令有许多参数,下面给出bcp命令参数的简要解析

用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件
  [-m 最大错误数]             [-f 格式化文件]         [-e 错误文件]
  [-F 首行]                   [-L 末行]             [-b 批大小]
  [-n 本机类型]               [-c 字符类型]         [-w 宽字符类型]
  [-N 将非文本保持为本机类型] [-V 文件格式版本]     [-q 带引号的标识符]
  [-C 代码页说明符]           [-t 字段终止符]       [-r 行终止符]
  [-i 输入文件]               [-o 输出文件]         [-a 数据包大小]
  [-S 服务器名称]             [-U 用户名]           [-P 密码]
  [-T 可信连接]               [-v 版本]             [-R 允许使用区域设置]
  [-k 保留空值]               [-E 保留标识值]
  [-h"加载提示"]              [-x 生成xml 格式化文件]

其中最常用的已经用粉红色字体标注。

2.bcp命令实例

这里我们以AdventureWorks样例数据库为例进行实验。

2.1.将表中数据导出到一个文件中(使用可信连接)

bcp AdventureWorks.Sales.Currency out c:\Currency.dat -T -c

上面的参数 out 表示输出文件,c:\Currency.dat是文件名和路径,-T表示可信连接,这个跟sqlcmd有点不同,在sqlcmd中使用-E表示可信连接。-c表示以字符形式输出,如果使用-w的话,输出内容相同,但是输出文件的大小将增加一倍。如果你要将导出的Currency.dat文件导入到非sql server数据库中,那么使用-w比较好。

2.2.将表中数据导出到一个文件中(使用混合模式身份验证)

bcp AdventureWorks.Sales.Currency out c:\Currency.dat -c -Usa -Psa12345 -S.

这个数据导出语句与前面的不同之处是,前面使用可信连接,也就是windows验证,不需要输入用户名和密码。而此时使用的是sql server 验证方式,所以得输入sql server数据库用户名与密码。这里-S表示要连接的数据源,我这里-S.表示连接本地的默认实例,如果不加-S这个参数也会连接到默认实例中,如果要连接命名实例的话,可以使用参数:-S<server_name\instance_name>

2.3.将文件中的数据导入到表中

bcp Utility中提到:

“如果使用 bcp 备份数据,请创建一个格式化文件来记录数据格式。 bcp 数据文件不包括任何架构或格式信息,因此如果已删除表或视图并且不具备格式化文件,则可能无法导入数据。”

这句话的意思是,假如你要使用bcp来备份数据的话,那么最好也将数据的表结构也跟数据一起导出来。这样的话即使表被删除了,也可以通过先创建表,然后再使用bcp导入数据的方法进行还原。但是如果你只是用bcp备份数据,而没有备份表结构,那么当表被删除以后,你将无法使用bcp导入数据。

更深层的意思就是,如果你要使用bcp导入数据,那么必须有表结构。这个类似于insert into select的复制操作,因为它也需要先创建好表,然后再进行数据备份。具体可以参考:SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

所以假如我们要将前面导出的Currency.dat导入到数据库中,那么数据库中必须有对应的一张表,我们这里创建一张叫做Sales.Currency2的空表,sql语句如下:

USE AdventureWorks;
GO
SELECT * INTO Sales.Currency2
FROM AdventureWorks.Sales.Currency WHERE 1=2;--只创建表结构而不会插入数据

在创建好表结构以后,就可以将本地文件中的数据导入到数据库表中,导入的bcp命令如下:

bcp AdventureWorks.Sales.Currency2 in c:\Currency.dat -T -c

2.4.bcp中使用queryout关键词

如果要根据某种条件来导出数据的话,可以使用queryout关键字。

2.4.1.将特定的列复制到数据文件中

bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout c:\Currency.Name.dat -T -c

2.4.2.将特定的行复制到数据文件中

bcp "select * from AdventureWorks.Sales.Currency where CurrencyCode='AED' and Name='Emirati Dirham'" queryout c:\Currency3.dat -T -c

3.大数据量的批量导入

bcp本身就可应用于大数据量的批量导入,不过他是命令行形式,如果要使用sql命令进行大数据量的批量导入,可以使用bulk insert,这个在之前的一篇博客中有提到,并进行了实验,可以参考:某社区600万用户数据导入MYSQL、MSSQL、Oracle数据库方法。另外还找了一篇博客,里面列出了bulk insert和bcp的批量导入方式,详细请参考:SQL Server BCP使用小结

bcp并不只是只能在cmd命令行中执行,也可以在sql查询语句中执行,不过这需要调用一个存储过程。比如前面的将数据库表的数据导出到一个文件中,可以在SSMS中执行如下sql语句

exec master..xp_cmdshell 'bcp AdventureWorks.Sales.Currency out c:\Currency.dat -T -c'

假如你在执行上述语句的时候报如下错误:

SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

你可以通过执行如下语句来解决问题:参考:xp_cmdshell Option

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

[转帖]Sqlserver BCP 的用法的更多相关文章

  1. SQL SERVER BCP的用法

    转自:https://www.cnblogs.com/fishparadise/p/4809014.html 前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储 ...

  2. sqlserver bcp命令导出数据

    原文:sqlserver bcp命令导出数据 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net ...

  3. [转帖] sqlserver CAL 授权模式下 只能够有20个core的使用问题

    http://www.cnblogs.com/diabloxl/p/3623640.html?utm_source=tuicool&utm_medium=referral 公司这边性能组老师进 ...

  4. mssql sqlserver if exists 用法大汇总

    摘要: 下文讲述sqlserver中,更新脚本中常用if exists关键字的用法说明,如下所示: 实验环境:sql server 2008 R2 一.检测数据库是否存在于当前数据库引擎下 if ex ...

  5. SQLServer BCP 命令的使用

    现在有一个包含数据的文件,每个字段用“|”分隔,现在要把这些数据导入到数据库的表中. 数据文件如下: R001|20150710 可以使用如下命令: bcp testDB.dbo.testTable ...

  6. SQLServer Ansi_Padding的用法

    关于Ansi_Padding的用法 1.当设置为ON时,不剪裁字符值中插入到varchar列的尾随空格和二进制值中插入到varbinary列的尾随零.不将值按列的长度进行填充. 2.当设置为OFF时, ...

  7. BCP的用法

    bcp kaiser..kp_rates in c:\kp.bcp -U buykporg -P buykporg -S localhost -c bcp ccrm_oem_shqc.."s ...

  8. SQLPLUS SQLCMD连接管理oracle sqlserver的简单用法

    1. SQLPLUS 与plsql一样,其实不需要安装oracle客户端,只要是有sqlplus的即时客户端 以及将目录放置到path或者是相应的oralce_home变量中即可. 打开运行cmd s ...

  9. [转帖]SQLSERVER 使用触发器实现 禁用sa用户 在非本机登录

    原贴地址: https://blog.csdn.net/reblue520/article/details/51580102 具体的方法为: 创建一个触发器 CREATE TRIGGER forbid ...

随机推荐

  1. Kotlin for循环使用

    普通for循环 for(i in 1..4){ println(i) } 结果为1234 循环四次 反序for循环 for(i in 4 downTo 1){ println(i) } 结果为4321 ...

  2. C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的 ...

  3. CSS代码片段

    定位: 将元素居中 将元素水平居中 将元素垂直居中 样式: 文字毛玻璃效果 -------------------------------------------代码----------------- ...

  4. 当input框输入到限定长度时,自动focus下一个input框

     需求背景 需要输入一串15位的数字,但是要分为3个输入框,每个输入框限定长度5位,当删除当前输入框的内容时,focus到上一个输入框: 实现方法 var field = $('.phone-fiel ...

  5. JS实现图片base64转blob对象,压缩图片,预览图片,图片旋转到正确角度

    base64转blob对象 /** 将base64转换为文件对象 * @param {String} base64 base64字符串 * */ var convertBase64ToBlob = f ...

  6. vue+vuecli+webapck2实现多页面应用

    准备工作 在本地用vue-cli新建一个项目,首先安装vue-cil,命令: npm install -g vue-cli 新建一个vue项目,创建一个基于"webpack"的项目 ...

  7. 使用OCLint和Sonar对iOS代码分析和质量管理

    OCLint 是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析. Sonar 是一个用于代码质量管理的开放平台.通过插件机制, ...

  8. 总结XSS与CSRF两种跨站攻击

    XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...

  9. Oracle获取表字段名,字段类型,字段长度,注释

    SELECT b.comments as 注释, a.column_name as 列名, a.data_type || '(' || a.data_length || ')' as 数据类型, a. ...

  10. AngularJS学习之旅—AngularJS 服务(八)

    1.AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务.2.什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 Angular ...