设为首页 收藏本站
查看: 725|回复: 0

[经验分享] SQL Server中bcp命令的用法以及数据批量导入导出

[复制链接]

尚未签到

发表于 2015-7-4 11:52:13 | 显示全部楼层 |阅读模式
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

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
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83061-1-1.html 上篇帖子: SQL SERVER(openrowset函数)从文件(.dbf)读取数据并将数据作为行集返回 下篇帖子: 视图的创建及使用(sql server 2005)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表