使用英语阅读

通过


使用字符格式导入或导出数据 (SQL Server)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的仓库

将数据批量导出到要在其他程序中使用的文本文件时,或从其他程序生成的文本文件批量导入数据时,建议使用字符格式。

采用字符格式后,所有列均应用字符数据格式。 如果要将数据用于其他程序(如电子表格程序),或需要通过其他数据库供应商(如 Oracle)将数据复制到 SQL Server 实例中,则以字符格式存储信息会非常有用。

备注

当你在 Microsoft SQL Server 的实例之间批量传输数据,且数据文件包含 Unicode 字符数据,但不包含任何扩展字符或 DBCS 字符时,请使用 Unicode 字符格式。 有关详细信息,请参阅 使用 unicode 字符格式导入或导出数据(SQL Server)

使用字符格式的注意事项

使用字符格式时,请考虑:

  • 默认情况下, bcp 实用工具 使用制表符分隔字符数据字段,并用换行符终止记录。 有关如何指定替换终止符的详细信息,请参阅指定字段终止符和行终止符 (SQL Server)

  • 默认情况下,在批量导出或导入字符模式数据之前,将执行下列转换:

    批量操作的方向 转换
    导出 将数据转换为字符表示形式。 如果进行显式请求,字符列的数据将转换为所请求的代码页。 如果未指定代码页,将通过使用客户端计算机的 OEM 代码页对字符数据进行转换。
    导入 根据需要,将字符数据转换为本机表示形式,并将字符数据从客户端的代码页转换为一个或多个目标列的代码页。
  • 为避免在转换期间丢失扩展字符,请使用 Unicode 字符格式或指定代码页。

  • 存储在字符格式文件中的所有 sql_variant 数据都是在不包括元数据的情况下进行存储的。 每个数据值都将按照隐式数据转换规则转换为 char 格式。 当数据导入到 sql_variant 列中时,该数据是以 char格式导入的。 而导入到数据类型不是 sql_variant的列中时,数据将通过隐式转换从 char 格式转换为其他格式。 有关数据转换的详细信息,请参阅 数据类型转换(数据库引擎)

  • bcp 实用工具money 值作为字符格式数据文件导出时,该数据文件小数点后保留四位数字且不带诸如逗号分隔符之类的任何数字分组符号。 例如,包含值 1,234,567.123456货币 列作为字符串 1234567.1235批量导出到数据文件。

字符格式的命令选项

可以使用 bcpBULK INSERT(Transact-SQL)OPENROWSET (Transact-SQL)将字符格式数据导入表中。 对于 bcp 命令或 BULK INSERT (Transact-SQL) 语句,可以在语句中指定数据格式。 对于 OPENROWSET (Transact-SQL) 语句,必须在格式化文件中指定数据格式。

下列命令选项支持字符格式:

Command 选项 说明
bcp -c 让 bcp 实用工具使用字符数据。*
BULK INSERT DATAFILETYPE ='char' 在批量导入数据时使用字符格式。
OPENROWSET 空值 必须使用格式化文件

* 若要将字符(-c)数据加载到与早期版本的 SQL Server 客户端兼容的格式,请使用 -V 开关。 有关详细信息,请参阅 从早期版本的 SQL Server 中导入本机和字符格式数据

备注

或者,您可以在格式化文件中为每个字段指定格式设置。 有关详细信息,请参阅 格式化文件以导入或导出数据(SQL Server)

示例测试条件

本文中的示例基于下表和格式化文件。

示例表

以下脚本创建一个测试数据库,一个名为 myChar 的表,并使用一些初始值填充该表。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myChar ( 
   PersonID smallint NOT NULL,
   FirstName varchar(25) NOT NULL,
   LastName varchar(30) NOT NULL,
   BirthDate date,
   AnnualSalary money
   );

-- Populate table
INSERT TestDatabase.dbo.myChar
VALUES 
(1, 'Anthony', 'Grosse', '1980-02-23', 65000.00),
(2, 'Alica', 'Fatnowna', '1963-11-14', 45000.00),
(3, 'Stella', 'Rossenhain', '1992-03-02', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myChar;

示例非 XML 格式化文件

SQL Server 支持两种类型的格式化文件:非 XML 格式和 XML 格式。 非 XML 格式是 SQL Server 早期版本支持的原始格式。 有关详细信息,请参阅 非 XML 格式化文件(SQL Server)。 以下命令使用 bcp 实用工具 基于 myChar架构生成非 xml 格式化文件 myChar.fmt。 若要使用 bcp 命令创建格式化文件,请指定 FORMAT 参数并使用 nul 而不是数据文件路径。 格式选项还需要使用 -f 选项。 此外,对于此示例,限定符 c 用于指定字符数据,T 用于使用集成安全性指定受信任的连接。

在命令提示符处输入以下命令:

bcp TestDatabase.dbo.myChar format nul -f D:\BCP\myChar.fmt -T -c 

REM Review file
Notepad D:\BCP\myChar.fmt

重要

确保非 XML 格式化文件以回车符/换行符结尾。 否则可能会收到以下错误消息:

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

例子

以下示例使用本文前面创建的数据库和格式化文件。

使用 bcp 和字符格式导出数据

-c 开关和 OUT 命令。

此示例中创建的数据文件将用于所有后续示例。

在命令提示符处输入以下命令:

bcp TestDatabase.dbo.myChar OUT D:\BCP\myChar.bcp -T -c

REM Review results
NOTEPAD D:\BCP\myChar.bcp

使用 bcp 和字符格式导入没有格式化文件的数据

-c 开关和 IN 命令。 在命令提示符处输入以下命令:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myChar;"

REM Import data
bcp TestDatabase.dbo.myChar IN D:\BCP\myChar.bcp -T -c

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myChar;"

使用 bcp 和字符格式通过非 XML 格式化文件导入数据

-c-f 开关和 IN 命令。 在命令提示符处输入以下命令:

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myChar;"

REM Import data
bcp TestDatabase.dbo.myChar IN D:\BCP\myChar.bcp -f D:\BCP\myChar.fmt -T

REM Review results
SQLCMD -Q "SELECT * FROM TestDatabase.dbo.myChar;"

在不使用格式化文件的情况下使用 BULK INSERT 和字符格式

DATAFILETYPE 参数。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:

TRUNCATE TABLE TestDatabase.dbo.myChar; -- for testing
BULK INSERT TestDatabase.dbo.myChar
    FROM 'D:\BCP\myChar.bcp'
    WITH (
        DATAFILETYPE = 'Char'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myChar;

对非 XML 格式化文件使用 BULK INSERT 和字符格式

这是 FORMATFILE 参数的示例。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:

TRUNCATE TABLE TestDatabase.dbo.myChar; -- for testing
BULK INSERT TestDatabase.dbo.myChar
   FROM 'D:\BCP\myChar.bcp'
   WITH (
        FORMATFILE = 'D:\BCP\myChar.fmt'
        );

-- review results
SELECT * FROM TestDatabase.dbo.myChar;

将 OPENROWSET 和字符格式与非 XML 格式文件一起使用

FORMATFILE 参数的示例。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:

TRUNCATE TABLE TestDatabase.dbo.myChar;  -- for testing
INSERT INTO TestDatabase.dbo.myChar
    SELECT *
    FROM OPENROWSET (
        BULK 'D:\BCP\myChar.bcp', 
        FORMATFILE = 'D:\BCP\myChar.fmt'  
        ) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myChar;

若要使用数据格式进行批量导入或批量导出,请执行以下步骤: