zoukankan      html  css  js  c++  java
  • SQL Server中bcp命令的用法以及数据批量导入导出

    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 格式化文件]

    1.1 bcp可以执行四种操作:

    (1) 导入 
    这个动作使用in命令完成,后面跟需要导入的文件名。 
    (2) 导出 
    这个动作使用out命令完成,后面跟需要导出的文件名。 
    (3) 使用SQL语句导出 
    这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。 
    (4) 导出格式文件 
    这个动作使用format命令完成,后而跟格式文件名。

    1.2 常用参数:

    -f format_file 
    format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。
    
    -x 
    这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。
    
    -F first_row 
    指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
    
    -L last_row 
    指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
    
    -c 
    使用char类型做为存储类型,没有前缀且以"	"做为字段分割符,以"
    "做为行分割符。
    
    -w 
    和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。
    
    -t field_term 
    指定字符分割符,默认是"	"。
    
    -r row_term 
    指定行分割符,默认是"
    "。
    
    -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.3 bcp常用操作

    --导出数据到tset1.txt,并指定本地数据库的用户名和密码
    --这里需要注意:指定的数据库必须是完全限定名。
    EXEC master..xp_cmdshell 'BCP "select * from testad.dbo.Test" queryout d:	set1.txt -c -U"sa" -P"sasasa"'
    
    --导出数据到tset2.xls,使用-T信任连接
    --通过-F 10 -L 13 指定导出的起始行和结束行数
    EXEC master..xp_cmdshell 'BCP "select * from testad.dbo.Test" queryout d:	est2.xls -c -F 10 -L 13 -T"'
    
    
    --使用in语句来将数据导入到数据表
    EXEC master..xp_cmdshell 'BCP te.dbo.Test in D:	est2.xls -c -T'

    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_nameinstance_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

    参考: https://msdn.microsoft.com/zh-cn/library/ms162802.aspx

  • 相关阅读:
    学习笔记 四边形不等式的模型
    题解 AT2230【Water Distribution】
    题解 CF848C 【Goodbye Souvenir】
    第二届全国大学生算法设计与编程挑战赛(春季赛)正式赛题解&比赛回顾
    积性函数相关学习笔记
    【MySQL】数据库备份
    【SpringMVC】SSM的maven依赖
    【SpringMVC】Jackson解决乱码问题配置
    【SpringMVC】DispatcherServlet与中文过滤器配置
    【Spring】学习笔记008--AOP实现方式
  • 原文地址:https://www.cnblogs.com/qiangshu/p/5233464.html
Copyright © 2011-2022 走看看