使用字符格式导入或导出数据 (SQL Server)
适用于:SQL Server
Azure 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
批量导出到数据文件。
可以使用 bcp、BULK 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;
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
以下示例使用本文前面创建的数据库和格式化文件。
-c
开关和 OUT
命令。
此示例中创建的数据文件将用于所有后续示例。
在命令提示符处输入以下命令:
bcp TestDatabase.dbo.myChar OUT D:\BCP\myChar.bcp -T -c
REM Review results
NOTEPAD D:\BCP\myChar.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;"
-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;"
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;
这是 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;
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;
若要使用数据格式进行批量导入或批量导出,请执行以下步骤: