适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
使用包含扩展/DBCS 字符的数据文件在多个 SQL Server 实例之间大容量传输数据时,建议使用 Unicode 字符格式。 Unicode 字符数据格式允许使用与执行作的客户端所使用的代码页不同的代码页从服务器导出数据。 在这种情况下,使用 Unicode 字符格式有下列优点:
如果源数据和目标数据的类型为 Unicode,则使用 Unicode 字符格式可以保留所有的字符数据。
如果源数据和目标数据不是 Unicode 数据类型,则使用 Unicode 字符格式可最大程度地减少源数据中无法表示的扩展字符丢失。
使用 Unicode 字符格式的注意事项
使用 Unicode 字符格式时,请考虑:
默认情况下, bcp 实用工具 使用制表符分隔字符数据字段,并用换行符终止记录。 有关如何指定备用终止符的信息,请参阅“指定字段和行终止符”(SQL Server)。
Unicode 字符格式数据文件中存储的 sql_variant 数据的操作方式与字符格式数据文件中的同类数据的操作方式相同,唯一的不同是该数据存储为 nchar 数据而不是 char 数据。 有关字符格式的详细信息,请参阅 排序规则和 Unicode 支持。
使用 Unicode 字符格式、bcp 和格式化文件的特殊注意事项
Unicode 字符格式数据文件遵循 Unicode 文件的约定。 该文件的前两个字节为十六进制数字 0xFFFE。 这两个字节用作字节顺序标记 (BOM),指定在文件中高位字节是存储在前面还是后面。 bcp 实用工具可能会错误解释 BOM,导致导入过程的一部分失败;可能会收到如下所示的错误消息:
Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification
在以下情况下,BOM 可能被误解:
使用 bcp 实用工具 并使用
-w
开关来指示 Unicode 字符。使用格式化文件
数据文件中的第一个字段是非字符
请考虑以下任何解决方法是否可用于 特定 情况:
请勿使用格式化文件。 在 不使用格式化文件的情况下使用 bcp 和 Unicode 字符格式导入数据时提供了此解决方法的示例。
使用
-c
开关而不是-w
使用本机格式重新导出数据,
使用 BULK INSERT(Transact-SQL)或 OPENROWSET(Transact-SQL)。 这些解决方法的示例在 使用 BULK INSERT 和 Unicode 字符格式与非 XML 格式化文件结合使用 和 使用 OPENROWSET 和 Unicode 字符格式与非 XML 格式化文件结合使用 部分中提供。
在目标表中手动插入第一条记录,然后使用
-F 2
开关在第二条记录上启动导入,在数据文件中手动插入虚拟第一条记录,然后使用
-F 2
开关在第二条记录上启动导入。 在 “使用 bcp 和 Unicode 字符格式通过非 XML 格式文件导入数据” 部分中提供了此解决方法的示例。使用临时表,其中第一列为字符数据类型,或
重新导出数据并更改数据字段顺序,以便第一个数据字段是字符。 然后使用格式化文件将数据字段重新映射到表中的实际顺序。 有关示例,请参阅使用格式化文件将表列映射到数据文件字段(SQL Server)。
Unicode 字符格式的命令选项
可以使用 bcp、 BULK INSERT 或 OPENROWSET 将 Unicode 字符格式数据导入表中。 对于 bcp 命令或 BULK INSERT 语句,可以在语句中指定数据格式。 对于 OPENROWSET 语句,必须在格式化文件中指定数据格式。
下列命令选项支持 Unicode 字符格式:
指令 | 选项 | 说明 |
---|---|---|
bcp |
-w |
使用 Unicode 字符格式。 |
BULK INSERT |
DATAFILETYPE ='widechar' |
批量导入数据时使用 Unicode 字符格式。 |
OPENROWSET |
空值 | 必须使用格式化文件 |
注意
或者,您可以在格式化文件中为每个字段指定格式设置。 有关详细信息,请参阅格式化文件以导入或导出数据(SQL Server)。
示例测试条件
本文中的示例基于下表和格式化文件。
示例表
以下脚本创建一个测试数据库,一个名为 myWidechar
的表,并使用一些初始值填充该表。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
CREATE DATABASE TestDatabase;
GO
USE TestDatabase;
CREATE TABLE dbo.myWidechar
(
PersonID SMALLINT NOT NULL,
FirstName NVARCHAR (25) NOT NULL,
LastName NVARCHAR (30) NOT NULL,
BirthDate DATE,
AnnualSalary MONEY
);
-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES (1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
(2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
(3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);
-- Review data
SELECT * FROM TestDatabase.dbo.myWidechar;
示例非 XML 格式化文件
SQL Server 支持两种类型的格式化文件:非 XML 格式和 XML 格式。 非 XML 格式是 SQL Server 早期版本支持的原始格式。 有关详细信息,请参阅使用非 XML 格式化文件(SQL Server)。
以下命令使用 bcp 实用工具根据架构myWidechar.fmt
生成非 XML 格式化文件myWidechar
。 若要使用 bcp 命令创建格式化文件,请指定 format
参数并使用 nul
而不是数据文件路径。 格式选项还需要使用 -f
选项。 此外,对于此示例,限定符 c
用于指定字符数据,T
用于使用集成安全性指定受信任的连接。 在命令提示符处输入以下命令:
bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w
REM Review file
Notepad D:\BCP\myWidechar.fmt
重要
确保非 XML 格式化文件以回车符/换行符结尾。 否则,可能会收到以下错误消息:
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file
例子
以下示例使用之前创建的数据库和格式化文件。
使用 bcp 和 Unicode 字符格式导出数据
-w
开关和 OUT
命令。 此示例中创建的数据文件用于所有后续示例。 在命令提示符处输入以下命令:
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w
REM Review results
NOTEPAD D:\BCP\myWidechar.bcp
使用 bcp 和 Unicode 字符格式导入数据而不使用格式化文件
-w
开关和 IN
命令。 在命令提示符处输入以下命令:
REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"
REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w
REM Review results is SSMS
使用 bcp 和 Unicode 字符格式通过非 XML 格式化文件导入数据
-w
和 -f
开关以及 IN
命令。 需要使用解决方法,因为此示例涉及 bcp、格式化文件、Unicode 字符和数据文件中的第一个数据字段是非字符。 请参阅本文前面的有关 使用 Unicode 字符格式、bcp 和格式化文件的特殊注意事项 。 通过将额外的记录添加为“虚拟”记录来更改数据文件 myWidechar.bcp
,然后通过 -F 2
开关跳过该记录。
在命令提示符中,输入以下命令,然后按照修改步骤操作:
REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"
REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record. This additional record is the "dummy" record.
REM Close file.
REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2
REM Review results is SSMS
REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w
使用 BULK INSERT 和 Unicode 字符格式,而无需格式化文件
DATAFILETYPE
论点。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
WITH (DATAFILETYPE = 'widechar');
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
将 BULK INSERT 和 Unicode 字符格式与非 XML 格式化文件配合使用
FORMATFILE
论点。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
WITH (FORMATFILE = 'D:\BCP\myWidechar.fmt');
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
将 OPENROWSET 和 Unicode 字符格式与非 XML 格式化文件配合使用
FORMATFILE
论点。 在 Microsoft SQL Server Management Studio (SSMS) 中执行以下 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
INSERT INTO TestDatabase.dbo.myWidechar
SELECT * FROM OPENROWSET (
BULK 'D:\BCP\myWidechar.bcp',
FORMATFILE = 'D:\BCP\myWidechar.fmt'
) AS t1;
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
相关任务
使用数据格式进行批量导入或批量导出
- 从早期版本的 SQL Server 导入本地格式和字符格式数据
- 使用字符格式导入或导出数据 (SQL Server)
- 使用本机格式导入或导出数据 (SQL Server)
- 使用 Unicode 原生格式导入或导出数据(SQL Server)