暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux上的SQL Server使用bcp实用工具将数据批量复制到数据库表中

zxrmhh 2024-09-11
180

Linux上的SQL Server使用bcp实用工具将数据批量复制到数据库表中。

参考官方文档如下
https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-migrate-bcp?view=sql-server-ver16

1、本文内容

  • 安装 SQL Server 命令行工具
  • 使用 bcp 导入数据
  • 使用 bcp 导出数据
  • 相关内容

适用于:SQL Server - Linux

本文介绍如何使用 bcp 实用工具,参考官方文档如下
https://learn.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver16,

在 Linux 上的 SQL Server 实例和采用用户指定格式的数据文件之间批量复制数据。

可以使用 bcp 将许多行导入 SQL Server 表中,或将数据从 SQL Server 表导出到数据文件。 除非与 queryout 选项一起使用,否则 bcp 不需要 Transact-SQL 方面的知识。 bcp 命令行实用工具可用于在本地或云中、在 Linux、Windows 或 Docker 上以及在 Azure SQL 数据库和 Azure Synapse Analytics 中运行的 Microsoft SQL Server。

本文介绍如何:

  • 使用 bcp in 命令将数据导入表
  • 使用 bcp out 命令从表中导出数据

2、安装 SQL Server 命令行工具

bcp 是 SQL Server 命令行工具的一部分,不会随 Linux 上的 SQL Server 自动安装。 如果尚未在 Linux 计算机上安装 SQL Server 命令行工具,则必须先安装它们。 有关如何安装这些工具的详细信息,请从以下列表中选择 Linux 分发版:

Red Hat Enterprise Linux (RHEL)
https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver16&tabs=redhat-install#RHEL

通过安装命令行工具mssql-tools 包包含:

sqlcmd:命令行查询实用工具。
bcp:批量导入-导出实用工具。

https://learn.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver16

https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/connecting-with-bcp?view=sql-server-ver16

  • Available options -n
    -n
    使用数据的本机(数据库)数据类型执行大容量复制操作。
    -n
    Uses the native (database) data types of the data to do the bulk-copy operation.

  • Available options -Y
    -Y[s|m|o]
    指定连接加密模式。 选项有“严格”、“强制”和“可选”。 使用不带任何参数的 -Y 将使用强制加密模式,等效于 -Ym。 (从 bcp 版本 18 起提供)

-Y[s|m|o]
Specifies the connection encryption mode. The options are Strict, Mandatory, and Optional. Using -Y without any parameters uses the Mandatory encryption mode, and is equivalent to -Ym. (available since bcp version 18)

3、使用 bcp 导入数据

在本教程中,将在本地 SQL Server 实例 (localhost) 上创建示例数据库和表,然后使用 bcp 从磁盘上的文本文件加载到示例表。

3.1、创建示例数据库和表

首先创建一个具有简单表的示例数据库,本教程接下来会使用该数据库。

在 Linux 框中,打开命令终端。

将以下命令复制并粘贴到终端窗口中。 这些命令使用 sqlcmd 命令行实用工具在本地 SQL Server 实例 (superdb) 上创建示例数据库 (superdb) 和表 (T_Employees)。

运行命令前,请记得根据需要替换 username 和 <your_password>。

3.2、创建数据库 superdb:

sqlcmd -S localhost -U sa -P <your_password> -Q "CREATE DATABASE superdb;"

3.3、在数据库 superdb 中创建表 **T_Employees **:

sqlcmd -S localhost -U sa -P <your_password> -d superdb -Q "CREATE TABLE T_Employees (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, NameInfo NVARCHAR(50), Location NVARCHAR(50));" [mssql@centos8db ~]$ sqlcmd -S localhost -U sa -C -d superdb -Q "CREATE TABLE T_Employees (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, NameInfo NVARCHAR(50), Location NVARCHAR(50));" Password:xxx -- 此次输入密码

3.4、创建源数据文件

将以下命令复制并粘贴到终端窗口中。 我们使用内置的 cat 命令创建包含三条记录的示例文本数据文件,并将文件存放路径/tmp/emp_data.txt 。 记录中的字段用逗号分隔。

cat >~/emp_data.txt << EOF 1,sqlserver,Australia 2,mssql,India 3,super,Germany 4,米啊莎,CHN 5,欧朋么,CHN EOF

可通过在终端窗口中运行以下命令,验证是否已正确创建数据文件:

cat /tmp/emp_data.txt

终端窗口中应该会显示以下内容:

[mssql@centos8db ~]$ cat /tmp/emp_data.txt 1,sqlserver,Australia 2,mssql,India 3,super,Germany 4,米啊莎,CHN 5,欧朋么,CHN

3.5、从源数据文件导入数据

将以下命令复制并粘贴到终端窗口中。 此命令使用 bcp 连接到本地 SQL Server 实例 (localhost),并将数据文件 (/tmp/emp_data.txt) 中的数据导入数据库 (superdb ) 中的表 (T_Employees )。

运行命令前,请记得根据需要替换用户名和 <your_password>。

bcp T_Employees in /tmp/emp_data.txt -S localhost -U sa -P <your_password> -d superdb -c -t ',' bcp superdb.dbo.T_Employees in /tmp/emp_data.txt -n -S localhost -U sa -P<your_password> -Yo -c -t ','

以下是此示例中与 bcp 配合使用的命令行参数的简要概述:

-S:指定要连接到的 SQL Server 实例
-U:指定用于连接到 SQL Server 的登录 ID
-P:指定登录 ID 的密码
-d:指定要连接到的数据库
-c:使用字符数据类型执行操作
-t:指定字段终止符。 我们在数据文件中使用 comma 作为记录的字段终止符
备注

本示例中不指定自定义行终止符。 先前使用 cat 命令创建数据文件时,文本数据文件中的行已使用 newline 正确终止。

可通过在终端窗口中运行以下命令,验证是否已成功导入数据。

运行命令前,请记得根据需要替换 username 和 <your_password>。

sqlcmd -S localhost -d superdb -U sa -P <your_password> -I -Q “SELECT * FROM T_Employees ;”

应该会显示以下结果:

sqlcmd -S localhost -d superdb -U sa -P Root@2024 -C -I -Q "SELECT * FROM T_Employees ;" id NameInfo location ----------- ----------------------------- -------------------------------------------- 1 sqlserver Australia 2 mssql India 3 super Germany 4 米啊莎 CHN 5 欧朋么 CHN (5 行受影响) [mssql@orcl23c ~]$ sqlcmd -S localhost -d superdb -U sa -P Root@2024 -C -I -Q "SELECT * FROM t_order_sales ;" order_id user_no amount create_date -------- -------- ----------- ----------------------- 1001 C0001 1920 2020-01-01 00:00:00.000 1002 C0002 3510 2019-03-02 00:00:00.000 1003 C0003 3500 2022-04-12 00:00:00.000 1004 C0004 8030 2021-05-10 00:00:00.000 1005 C0011 9600 2023-03-12 00:00:00.000 1006 C0002 5021 2022-01-05 00:00:00.000 1007 C1002 6160 2018-01-06 00:00:00.000 1008 C2007 3201 2024-01-10 00:00:00.000 1009 C3008 8760 2023-01-16 00:00:00.000 1010 V0002 8870 2021-01-22 00:00:00.000 (10 rows affected)

4、使用 bcp 导出数据

在本教程中,将使用 bcp 把先前创建的示例表中的数据导出到新数据文件。

将以下命令复制并粘贴到终端窗口中。

这些命令使用 bcp 命令行实用工具,将数据库 superdb 中表 T_Employees 的数据导出到名为 /tmp/test_export.txt 的新数据文件中。 运行命令前,请记得根据需要替换用户名和 <your_password>。

bcp T_Employees out /tmp/test_export.txt -S localhost -U sa -P <your_password> -d superdb -c -t ',' -- OR bcp superdb.dbo.T_Employees out ~/test_export.txt -n -S localhost -U sa -P<your_password> -Yo -c -t ','

可通过在终端窗口中运行以下命令,验证是否已正确导出数据:

cat /tmp/test_export.txt

终端窗口中应该会显示以下内容:

1,sqlserver,Australia 2,mssql,India 3,super,Germany 4,米啊莎,CHN 5,欧朋么,CHN

5、遇到Error = [Microsoft][ODBC Driver 18 for SQL Server]

Error = [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate]
SQLState = 08001, NativeError = -1
Error = [Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722

-- bcp 导出导入时增加参数 -Yo ,详细文章前面已经提到 bcp superdb.dbo.xxx in ~/emp_data.txt -n -S localhost -U sa -P<your_password> -Yo -c -t ','

参考官方文档及stackoverflow.com

https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/connecting-with-bcp?view=sql-server-ver16

https://stackoverflow.com/questions/71688125/odbc-driver-18-for-sql-serverssl-provider-error1416f086

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论