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

    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
  • 相关阅读:
    Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. ......
    UVA 1597 Searching the Web
    UVA 1596 Bug Hunt
    UVA 230 Borrowers
    UVA 221 Urban Elevations
    UVA 814 The Letter Carrier's Rounds
    UVA 207 PGA Tour Prize Money
    UVA 1592 Database
    UVA 540 Team Queue
    UVA 12096 The SetStack Computer
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2651180.html
Copyright © 2011-2022 走看看