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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

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

注意

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

本主题内容:
使用字符格式的注意事项
字符格式的命令选项
示例测试条件
 ● 示例表
 ● 非 XML 格式化文件示例
示例
 ● 使用 bcp 和字符格式导出数据
 ● 在不使用格式化文件的情况下使用 bcp 和字符格式导入数据
 ● 在使用非 XML 格式化文件的情况下使用 bcp 和字符格式导入数据
 ● 在不使用格式化文件的情况下使用 BULK INSERT 和字符格式
 ● 在使用非 XML 格式化文件的情况下使用 BULK INSERT 和字符格式
 ● 在使用非 XML 格式化文件的情况下使用 OPENROWSET 和字符格式
相关任务

使用字符格式的注意事项

使用字符格式时,请考虑下列事项:

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

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

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

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

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

字符格式的命令选项

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

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

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.fmt生成非 XML 格式化文件 myChar。 若要使用 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;"

在使用非 XML 格式化文件的情况下使用 bcp 和字符格式导入数据

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

在使用非 XML 格式化文件的情况下使用 OPENROWSET 和字符格式

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;

使用数据格式进行批量导入或批量导出

另请参阅

bcp 实用工具
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
数据类型 (Transact-SQL)
导入来自早期版本的 SQL Server 的本机格式数据和字符格式数据