导入来自早期版本的 SQL Server 的本机格式数据和字符格式数据
若要使用 bcp 导入 Microsoft SQL Server 2000 或早期版本中的本机格式数据和字符格式数据,请使用 -V 开关。指定 -V 开关后,Microsoft SQL Server 2005 将使用 Microsoft SQL Server 早期版本中的数据类型,并且数据文件格式将与早期版本中的数据文件格式相同。
注意: |
---|
-V 开关扩展了 Microsoft SQL Server 7.0 中所使用的 -6 开关的功能。-6 的用法与 -V60 或 -V65 相同。尽管 SQL Server 仍然支持 -6 开关,但不推荐使用它。建议使用 -V。 |
若要确定数据文件是否为 SQL Server 早期版本的数据文件,请使用 -V 开关,如下所示:
SQL Server 版本 | 限定符 |
---|---|
Microsoft SQL Server 6.0 |
-V60 |
Microsoft SQL Server 6.5 |
-V65 |
SQL Server 7.0 |
-V70 |
SQL Server 2000 |
-V80 |
SQL Server 2005 数据类型的说明
SQL Server 2005 增加了对某些新类型的支持。如果想要将 SQL Server 2005 中的新类型的数据导入 SQL Server 2000 或早期版本中,必须将其存储为早期 bcp 客户端可读的格式。下表总结了如何转换 SQL Server 2005 的新数据类型以便与早期版本的 SQL Server 兼容。
SQL Server 2005 中的新数据类型 | 版本 6x 兼容的数据类型 | 版本 70 中兼容的数据类型 | 版本 80 中兼容的数据类型 |
---|---|---|---|
bigint |
decimal |
decimal |
* |
sql_variant |
text |
nvarchar(4000) |
* |
varchar(max) |
text |
text |
text |
nvarchar(max) |
ntext |
ntext |
ntext |
varbinary(max) |
image |
image |
image |
XML |
ntext |
ntext |
ntext |
UDT1 |
image |
image |
image |
* 此类型受本机支持。
1 UDT 表示用户定义的类型。
从 SQL Server 2005 中导出
当使用 –V80 开关大容量导出 SQL Server 2005 中的数据时,本机模式下的 nvarchar(max)、varchar(max)、varbinary(max)、XML 和 UDT 数据是以 4 个字节的前缀存储的,如 text、image 和 ntext 数据,而不是以 SQL Server 2005 默认的前缀(8 个字节的前缀)存储的。
从 SQL Server 7.0 或早期版本中导出
从 SQL Server 7.0 或早期版本中大容量导出数据时,请注意下列事项:
- 从 SQL Server 7.0、SQL Server 6.5 或 SQL Server 6.0 导出的 bigint 数据的存储格式取决于数据文件的数据格式:
- 在本机模式下或 Unicode 本机格式数据文件中,bigint 数据存储为 decimal(19,0)。
- 在字符模式下或 Unicode 字符格式的数据文件中,bigint 数据存储为字符或 Unicode 字符串 [-]digits(例如 –25688904432)。
- 对具有 char 或 varchar 列的表,在导出 SQL Server 6.0 或 SQL Server 6.5 中的数据时,bcp 为每个数据文件字段添加了与数据长度相等的 1 个字节的前缀。在具有 numeric 数据的表中,该信息以 SQL Server 本机格式写入数据文件。
- 在 SQL Server 7.0 和 SQL Server 2000 中,值为 0 表示列的长度为零。
从 SQL Server 6.5 或 6.0 中导出
此外,从 SQL Server 6.5 或 SQL Server 6.0 中大容量导出数据时,请注意下列事项:
- 在 SQL Server 或早期版本中,bcp 将空值表示为长度为 0 的值,而现在将空值存储为长度为 -1 的值。
- bit 列中的空值作为 0 值写入,因为 SQL Server 6.5 以及早期版本不支持可为空的 bit 数据。
- bcp 实用工具不会生成任何 SQL Server 6.0 或 SQL Server 6.5 日期格式的 datetime 或 smalldatetime 数据。日期将始终以 ODBC 格式写入。
- 由于支持多日期转换需要占用系统开销,使用 -V65 开关会影响性能。
- SQL Server 或早期版本中的数据值不同。有关详细信息,请参阅下一节“复制日期值”。
复制日期值
从 SQL Server 7.0 开始,bcp 使用了 ODBC 大容量复制 API。因此,为了将日期值导入到 SQL Server 7.0 或更高版本中,bcp 使用 ODBC 日期格式 (yyyy-mm-dd hh:mm:ss[.f...])。
而在 SQL Server 6.5 或以前版本中,bcp 使用的则是 DB-Library 大容量复制 API 和 DB-Library 日期格式。若要将日期格式从 SQL Server 6.5 或早期版本中导出到 SQL Server 7.0 或更高版本中,请使用 -V65 开关。如果指定 -V65,则 bcp 命令首先尝试使用 ODBC 日期格式转换数据文件中的日期值。如果转换失败,则 bcp 尝试使用 DB-Library 格式转换日期值。
但是对于字符格式的数据文件,bcp 命令始终对 datetime 和 smalldatetime 值使用 ODBC 默认格式将文件导出,即使指定了 -V65 也是如此。例如,包含日期 12 Aug 1998
的 datetime 列将以字符串 1998-08-12 00:00:00.000
的形式大容量复制到数据文件中。
重要提示: |
---|
在使用 bcp 将数据导入 smalldatetime 字段时,请确保秒的值为 00.000,否则操作将失败。smalldatetime 数据类型仅支持最接近的分钟值。BULK INSERT 和 INSERT ...SELECT * FROM OPENROWSET(BULK...) 在这种情况下不会失败,但会截断秒值。 |
由于支持多日期转换需要占用系统开销,使用 -V65 开关会影响性能。
请参阅
概念
其他资源
bcp 实用工具
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
数据类型 (Transact-SQL)
SQL Server 2005 数据库引擎的向后兼容性
CAST 和 CONVERT (Transact-SQL)