使用本机格式导入或导出数据

当使用不包含任何扩展/双字节字符集 (DBCS) 字符的数据文件在多个 MicrosoftSQL Server 实例之间大容量传输数据时,建议使用本机格式。

注意注意

若要使用包含扩展字符或 DBCS 字符的数据文件在多个 SQL Server 实例之间大容量传输数据,应使用 Unicode 本机格式。有关详细信息,请参阅使用 Unicode 本机格式导入或导出数据

本机格式保留数据库的本机数据类型。本机格式适用于 SQL Server 表之间的高速数据传输。如果使用格式化文件,则源表和目标表不必相同。数据传输分为两个步骤:

  1. 将源表中的数据大容量导出到数据文件中

  2. 将数据文件中的数据大容量导入到目标表中

在相同的表之间使用本机格式避免了在各数据类型与字符格式之间进行不必要的转换,从而节省了时间和空间。但是,若要获得最佳的传输速率,应执行几个有关数据格式的检查。为了防止加载的数据出现问题,请参阅以下限制列表。

限制

若要成功导入本机格式的数据,请确保:

  • 数据文件是本机格式的文件。

  • 目标表必须与数据文件(含有正确的列数、数据类型、长度及 NULL 状态等)兼容,或者您必须使用格式化文件将每一个字段映射到其相应列。

    注意注意

    如果从与目标表不匹配的文件中导入数据,那么导入操作可能会成功,但插入到目标表中的数据值很可能是错误的。这是由于文件中的数据是通过使用目标表的格式来解释的。因此,任何不匹配都会导致插入错误值。但是,这样的不匹配决不会导致数据库中出现逻辑或物理不一致。

    有关使用格式化文件的信息,请参阅用来导入或导出数据的格式化文件

成功的导入操作不会损坏目标表。

bcp 如何处理本机格式的数据

本节论述了 bcp 实用工具如何导出和导入本机格式数据的特殊注意事项。

  • 非字符数据

    bcp 实用工具使用 SQL Server 内部二进制数据格式将表中的非字符数据写入数据文件中。

  • char 数据或 varchar 数据

    在每个 char 字段或 varchar 字段的开头,bcp 都添加前缀长度。

    重要说明重要提示

    当使用本机模式时,默认情况下,bcp 实用工具先将 SQL Server 中的字符转换为 OEM 字符,然后将这些字符复制到数据文件中。bcp 实用工具先将数据文件中的字符转换为 ANSI 字符,然后将这些字符大容量导入到 SQL Server 表中。在执行这些转换过程中,可能丢失扩展字符数据。对于扩展字符,请使用 Unicode 本机格式或指定代码页。有关使用代码页的详细信息,请参阅在不同排序规则间复制数据

  • sql_variant 数据

    如果 sql_variant 数据以 SQLVARIANT 存储在本机格式数据文件中,则数据会保留其所有特征。记录每个数据值的数据类型的元数据与数据值一起存储。此元数据用于在目标 sql_variant 列中重新创建具有相同数据类型的数据值。

    如果目标列的数据类型不是 sql_variant,则每个数据值将按照隐式数据转换的一般规则转换为目标列的数据类型。如果在数据转换过程中出现错误,则回滚当前批。在 sql_variant 列之间传输的任何 char 值和 varchar 值都可能存在代码页转换问题。有关详细信息,请参阅在不同排序规则间复制数据

    有关数据转换的详细信息,请参阅数据类型转换(数据库引擎)

本机格式的命令选项

您可以使用 bcp、BULK INSERT 或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 将本机格式的数据导入到表中。对于 bcp 命令或 BULK INSERT 语句,您可以在命令行中指定数据格式。对于 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句,您必须在格式化文件中指定数据格式。

下列命令行选项支持本机格式:

命令

选项

说明

bcp

-n

使 bcp 实用工具使用本机数据类型的数据。1

BULK INSERT

DATAFILETYPE ='native'

使用本机数据类型或宽本机数据类型的数据。注意,如果格式化文件指定了数据类型,则不需要 DATAFILETYPE。

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

有关详细信息,请参阅 bcp 实用工具BULK INSERT (Transact-SQL)OPENROWSET (Transact-SQL)

注意注意

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

示例

下列示例演示如何使用 bcp 大容量导出本机数据以及使用 BULK INSERT 大容量导入相同数据。

示例表

下列示例要求 dbo 架构下的 AdventureWorks 示例数据库中存在名为 myTestNativeData 的表。必须先创建此表,才能运行这些示例。在 SQL Server Management Studio 查询编辑器中,执行以下语句:

USE AdventureWorks;
GO
CREATE TABLE myTestNativeData (
   Col1 smallint,
   Col2 nvarchar(50),
   Col3 nvarchar(50)
   ); 

若要填充此表并查看得到的内容,请执行以下语句:

INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(1,'DataField2','DataField3');
INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(2,'DataField2','DataField3');
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData

使用 bcp 大容量导出本机数据

若要将数据从表导出到数据文件,请将 bcpout 选项及以下限定符一起使用:

限定符

说明

-n

指定本机数据类型。

-T

指定 bcp 实用工具通过使用集成安全性的受信任连接连接到 SQL Server。如果未指定 -T,则需要指定 -U-P 才能成功登录。

下例将本机格式的数据从 myTestNativeData 表大容量导出到名为 myTestNativeData-n.Dat 数据文件的新数据文件中。在 Microsoft Windows 命令提示符下输入:

bcp AdventureWorks..myTestNativeData out C:\myTestNativeData-n.Dat -n -T

使用 BULK INSERT 大容量导入本机数据

下面的示例使用 BULK INSERT 将 myTestNativeData-n.Dat 数据文件中的数据导入到 myTestNativeData 表中。在 SQL Server Management Studio 查询编辑器中,执行以下语句:

USE AdventureWorks;
GO
BULK INSERT myTestNativeData 
    FROM 'C:\myTestNativeData-n.Dat' 
   WITH (DATAFILETYPE='native'); 
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData
GO