SQLServer中bcp命令的⽤法以及数据批量导⼊导出
0.参考⽂献:
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 格式化⽂件]
其中最常⽤的已经⽤粉红⾊字体标注。
sqlserver备份表语句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 备份数据,请创建⼀个格式化⽂件来记录数据格式。 bcp 数据⽂件不包括任何架构或格式信息,因此如果已删除表或视图并且不具备格式化⽂件,则可能⽆法导⼊数据。”
这句话的意思是,假如你要使⽤bcp来备份数据的话,那么最好也将数据的表结构也跟数据⼀起导出来。这样的话即使表被删除了,也可以通过先创建表,然后再使⽤bcp导⼊数据的⽅法进⾏还原。但是如果你只是⽤bcp备份数据,⽽没有备份表结构,那么当表被删除以后,你将⽆法使⽤bcp导⼊数据。
更深层的意思就是,如果你要使⽤bcp导⼊数据,那么必须有表结构。这个类似于insert into select的复制操作,因为它也需要先创建好表,然后再进⾏数据备份。具体可以参考:。
所以假如我们要将前⾯导出的Currency.dat导⼊到数据库中,那么数据库中必须有对应的⼀张表,我们这⾥创建⼀张叫做Sales.Currency2的空表,sql语句如下:
USE AdventureWorks;
GO
SELECT*INTO Sales.Currency2
FROM AdventureWorks.Sales.Currency WHERE1=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,这个在之前的⼀篇博客中有提到,并进⾏了实验,可以参考:。另外还了⼀篇博客,⾥⾯列出了bulk insert和bcp的批量导⼊⽅式,详细请参考:。
bcp并不只是只能在cmd命令⾏中执⾏,也可以在sql查询语句中执⾏,不过这需要调⽤⼀个存储过程。⽐如前⾯的将数据库表的数据导出到⼀个⽂件中,可以在SSMS中执⾏如下sql语句
p_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.
你可以通过执⾏如下语句来解决问题:参考:
-- 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。