应用场景
当使用不包含任何扩展/双字节字符集 (DBCS) 字符的数据文件在多个 SQL Server 实例之间大容量传输数据时,建议使用本机格式。
本机格式保留数据库的本机数据类型。
本机格式适用于 SQL Server 表之间的高速数据传输。
如果使用格式化文件,则源表和目标表不必相同。
数据传输分为两个步骤:
1. 将源表中的数据大容量导出到数据文件中
2. 将数据文件中的数据大容量导入到目标表中
在相同的表之间使用本机格式避免了在各数据类型与字符格式之间进行不必要的转换,从而节省了时间和空间。
但是,若要获得最佳的传输速率,应执行几个有关数据格式的检查。
为了防止加载的数据出现问题,请参阅以下限制列表。
限制
若要成功导入本机格式的数据,请确保:
1. 数据文件是本机格式的文件。
2. 目标表必须与数据文件(含有正确的列数、数据类型、长度及 NULL 状态等)兼容,或者您必须使用格式化文件将每一个字段映射到其相应列。
注意 |
如果从与目标表不匹配的文件中导入数据,那么导入操作可能会成功,但插入到目标表中的数据值很可能是错误的。 这是由于文件中的数据是通过使用目标表的格式来解释的。 因此,任何不匹配都会导致插入错误值。 但是,这样的不匹配决不会导致数据库中出现逻辑或物理不一致。 |
成功的导入操作不会损坏目标表。
bcp 如何处理本机格式的数据
本节论述了 bcp 实用工具如何导出和导入本机格式数据的特殊注意事项。
1. 非字符数据
bcp 实用工具使用 SQL Server 内部二进制数据格式将表中的非字符数据写入数据文件中。
2. char 数据或 varchar 数据
在每个 char 字段或 varchar 字段的开头,bcp 都添加前缀长度。
重要提示 |
当使用本机模式时,默认情况下,bcp 实用工具先将 SQL Server 中的字符转换为 OEM 字符,然后将这些字符复制到数据文件中。 bcp 实用工具先将数据文件中的字符转换为 ANSI 字符,然后将这些字符大容量导入到 SQL Server 表中。 在执行这些转换过程中,可能丢失扩展字符数据。 对于扩展字符,请使用 Unicode 本机格式或指定代码页。 |
3. 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 实用工具使用本机数据类型的数据。 |
BULK INSERT |
DATAFILETYPE ='native' |
使用本机数据类型或宽本机数据类型的数据。 注意,如果格式化文件指定了数据类型,则不需要 DATAFILETYPE。 |
若要将本机 (-n) 数据加载到与早期版本的 SQL Server 客户端相兼容的格式,请使用 -V 开关。
参考:
https://msdn.microsoft.com/zh-cn/library/ms191232.aspx
本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1628097,如需转载请自行联系原作者