签到成功

知道了

CNDBA社区CNDBA社区

SQL Server工具--bcp介绍与使用

2019-01-03 15:39 3297 0 原创 SQL Server
作者: Expect-乐

bcp(bulk copy program utility)是是用于在SQL Server中间复制大量数据的一个工具。

安装bcp

默认情况下是没有该工具的,所以需要单独安装。安装非常简单,windows直接下一步就可以里。Linux也就是解压,然后配置环境变量即可。下面简单说明一下安装方法。

http://www.cndba.cn/Expect-le/article/3222

Windows

首先根据操作系统版本下载对应的bcp安装包
64位:
https://download.microsoft.com/download/4/C/C/4CC1A229-3C56-4A7F-A3BA-F903C73E5895/EN/x64/MsSqlCmdLnUtils.msi
32位:
https://download.microsoft.com/download/4/C/C/4CC1A229-3C56-4A7F-A3BA-F903C73E5895/EN/x86/MsSqlCmdLnUtils.msi
直接双击安装即可。

Linux

  • 下载yum配置文件
    curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo
    
  • 安装
    bash yum install mssql-tools unixODBC-devel
    如果有老版本的bcp工具,请先卸载
    bash yum remove mssql-tools unixODBC-utf16-devel
  • 配置环境变量
    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
    source ~/.bashrc
    
    其他操作系统安装方法,请查看官方文档:
    https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-tools?view=sql-server-2017

bcp说明

语法:

http://www.cndba.cn/Expect-le/article/3222

[root@sqlserver ~]# bcp
usage: bcp {dbtable | query} {in | out | queryout | format} datafile
  [-m maxerrors]            [-f formatfile]          [-e errfile]
  [-F firstrow]             [-L lastrow]             [-b batchsize]
  [-n native type]          [-c character type]      [-w wide character type]
  [-N keep non-text native] [-q quoted identifier]
  [-t field terminator]     [-r row terminator]
  [-a packetsize]           [-K application intent]
  [-S server name or DSN if -D provided]             [-D treat -S as DSN]
  [-U username]             [-P password]
  [-T trusted connection]   [-v version]             [-R regional enable]
  [-k keep null values]     [-E keep identity values]
  [-h "load hints"]         [-d database name]

参数说明:http://www.cndba.cn/Expect-le/article/3222

  • datafile:需要指定完整的路径。将数据批量导入 SQL Server时,数据文件将包含要复制到指定的表或
    视图中的数据。 从 SQL Server中批量导出数据时,数据文件将包含从表或视图中复制的数据。
  • in 从文件复制到数据库表或视图。
  • out 从数据库表或视图复制到文件。 如果指定了现有文件,则该文件将被覆盖。 提取数据时,请注意 bcp 实用工具将空字符串表示为 null,而将 null 字符串表示为空字符串。
  • queryout 从查询中复制,仅当从查询大容量复制数据时才必须指定此选项。
  • format 根据指定的选项(-n、 -c、 -w或 -N)以及表或视图的分隔符创建格式化文件。 大容量复制数据时, bcp 命令可以引用一个格式化文件,从而避免以交互方式重复输入格式信息。 format 选项要求指定 -f 选项;创建 XML 格式化文件时还需要指定 -x 选项。

    http://www.cndba.cn/Expect-le/article/3222

  • “ query “ 是一个返回结果集的 Transact-SQL 查询。 如果该查询返回多个结果集,则只将第一个结果集复制到数据文件,而忽略其余的结果集。 将查询用双引号括起来,将查询中嵌入的任何内容用单引号括起来。 从查询大容量复制数据时,也必须指定queryout 。

  • -e err_文件
    指定错误文件的完整路径,此文件用于存储 bcp 实用工具无法从文件传输到数据库的所有行。 bcp 命令产生的错误消息将被发送到用户的工作站。 如果不使用此选项,则不会创建错误文件。
    如果 err_file 以连字符 (-) 或正斜杠 (/) 开头,则不要在 -e 与 err_file 值之间包含空格。http://www.cndba.cn/Expect-le/article/3222

  • -F first_row
    指定要从表中导出或从数据文件导入的第一行的编号。 此参数的值应大于 (>) 0,小于 (<) 或等于 (=) 总行数。 如果未指定此参数,则默认为文件的第一行。
    first_row 可以是一个最大为 2^63-1 的正整数值。 -F first_row 的值从 1 开始。http://www.cndba.cn/Expect-le/article/3222

  • -L last_row
    指定要从表中导出或从数据文件中导入的最后一行的编号。 此参数的值应大于 (>) 0,小于 (<) 或等于 (=) 最后一行的编号。 如果未指定此参数,则默认为文件的最后一行。
    last_row 可以是一个最大为 2^63-1 的正整数值。

  • -m max_errors
    指定取消 bcp 操作之前可能出现的语法错误的最大数目。 语法错误是指将数据转换为目标数据类型时的错误。 max_errors 总数不包括只能在服务器中检测到的错误,如约束冲突。

具体示例

创建一个空表StockItemTransactions_bcp用于后面导入测试,导出的数据文件是普通文本文件,所以数据文件不受操作系统限制,可以导入到Linux上的SQL Server中。

USE WideWorldImporters;  
GO  

SET NOCOUNT ON;

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Warehouse.StockItemTransactions_bcp')     
BEGIN
    SELECT * INTO WideWorldImporters.Warehouse.StockItemTransactions_bcp
    FROM WideWorldImporters.Warehouse.StockItemTransactions  
    WHERE 1 = 2;  

    ALTER TABLE Warehouse.StockItemTransactions_bcp 
    ADD CONSTRAINT PK_Warehouse_StockItemTransactions_bcp PRIMARY KEY NONCLUSTERED 
    (StockItemTransactionID ASC);
END

A.将表数据复制到数据文件中(操作系统认证)
将数据库WideWorldImporters中用户Warehouse下的表StockItemTransactions复制到数据文件StockItemTransactions_character.bcp中

C:/Users/Administrator>bcp WideWorldImporters.Warehouse.StockItemTransactions out D:/BCP/StockItemTransactions_character.bcp -c -T

开始复制...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Warning: BCP import with a format file will convert empty strings in delimited columns to NULL.
1000 rows successfully bulk-copied to host-file. Total received: 1000
1000 rows successfully bulk-copied to host-file. Total received: 2000
1000 rows successfully bulk-copied to host-file. Total received: 3000
1000 rows successfully bulk-copied to host-file. Total received: 4000
1000 rows successfully bulk-copied to host-file. Total received: 5000
略。。。
1000 rows successfully bulk-copied to host-file. Total received: 235000
1000 rows successfully bulk-copied to host-file. Total received: 236000

已复制 236667 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒)     : 1359   平均值: (每秒 174147.91 行。)

扩展语法:指定最大语法错误数、一个错误文件和一个输出文件。那么屏幕上就不会打印输出信息了。

bcp WideWorldImporters.Warehouse.StockItemTransactions OUT D:/BCP/StockItemTransactions_native.bcp -m 1 -n -e D:/BCP/Error_out.log -o D:/BCP/Output_out.log -S -T

B将表数据复制到数据文件中(用户/密码)
通过指定用户名和密码来连接数据库并复制表的数据。http://www.cndba.cn/Expect-le/article/3222

C:/Users/Administrator>bcp WideWorldImporters.Warehouse.StockItemTransactions out D:/BCP/StockItemTransactions_character.bcp -c -U sa -S 127.0.0.1 --如果需要指定实例名则IP/实例名
密码:

开始复制...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Warning: BCP import with a format file will convert empty strings in delimited columns to NULL.
略。。。
1000 rows successfully bulk-copied to host-file. Total received: 236000

已复制 236667 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒)     : 1391   平均值: (每秒 170141.63 行。)

C.将数据文件中的数据复制到表中
上面几个例子是将数据复制到数据文件中,下面将数据从数据文件中复制到表StockItemTransactions_bcp中。

C:/Users/Administrator>bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:/BCP/StockItemTransactions_character.bcp -c -T

开始复制...
1000 rows sent to SQL Server. Total sent: 1000
1000 rows sent to SQL Server. Total sent: 2000
略。。。
1000 rows sent to SQL Server. Total sent: 235000
1000 rows sent to SQL Server. Total sent: 236000

已复制 236667 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒)     : 2203   平均值: (每秒 107429.41 行。)

查看数据是否正确导入:

SELECT TOP (10) *
  FROM [WideWorldImporters].[Warehouse].[StockItemTransactions_bcp]

扩展语法:使用提示 TABLOCK,指定最大语法错误数、一个错误文件和一个输出文件。http://www.cndba.cn/Expect-le/article/3222

bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:/BCP/StockItemTransactions_native.bcp -b 5000 -h "TABLOCK" -m 1 -n -e D:/BCP/Error_in.log -o D:/BCP/Output_in.log -S -T

D.将指定的列复制到数据文件中
只复制指定的行到数据文件中,若要复制特定列,可以使用 queryout 选项。

http://www.cndba.cn/Expect-le/article/3222

C:/Users/Administrator>bcp "SELECT StockItemTransactionID FROM WideWorldImporters.Warehouse.StockItemTransactions WITH (NOLOCK)" queryout D:/BCP/StockItemTransactionID_c.bcp -c -T

开始复制...
1000 rows successfully bulk-copied to host-file. Total received: 1000
1000 rows successfully bulk-copied to host-file. Total received: 2000
1000 rows successfully bulk-copied to host-file. Total received: 3000
1000 rows successfully bulk-copied to host-file. Total received: 4000
略。。。
1000 rows successfully bulk-copied to host-file. Total received: 236000

已复制 236667 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒)     : 297    平均值: (每秒 796858.56 行。)

E.将指定的行复制到数据文件中
同样可以通过条件只复制指定的行。

http://www.cndba.cn/Expect-le/article/3222

C:/Users/Administrator>bcp "SELECT * from Application.People WHERE FullName = 'Amy Trefl'" queryout D:/BCP/Amy_Trefl_c.bcp -d WideWorldImporters -c -T

开始复制...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Warning: BCP import with a format file will convert empty strings in delimited columns to NULL.

已复制 1 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒)     : 15     平均值: (每秒 66.67 行。)

版权声明:本文为博主原创文章,未经博主允许不得转载。

bcp

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Expect-乐

Expect-乐

关注

Without the continuous bitter cold, there can be no fragrant plum blossom

  • 336
    原创
  • 6
    翻译
  • 100
    转载
  • 41
    评论
  • 访问:1378980次
  • 积分:1957
  • 等级:核心会员
  • 排名:第3名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ