格式化文件简介
用于存储与特定表相关的数据文件中各字段格式信息的文件称为“格式化文件”。格式化文件提供了大容量导出或大容量导入数据所需的全部格式信息。格式化文件为编写数据文件提供了一个灵活的系统,用户只需进行极少的编辑甚至无需编辑即可编写出符合其他数据格式的数据文件,或从其他软件读取数据文件。
在 Microsoft SQL Server 2000 和更早期的版本中,大容量导出和导入使用的是单一类型的格式化文件。仍然支持这种文件。不过,SQL Server 2005 及更高版本还支持 XML 格式化文件,作备选之用。原始类型的格式化文件称为“非 XML 格式化文件”。
所有格式化文件都包含对数据文件中每个字段的说明。XML 格式化文件还包含对相应表列的说明。通常,XML 与非 XML 格式化文件可以互换。但是,建议您为新的格式化文件使用 XML 语法,因为与非 XML 格式化文件相比,格式化文件具有多项优点。XML 格式化文件具有以下特征:
自描述且易于读取、创建和扩展。
包含目标列的数据类型。
这可以将数据文件中数据的表示形式与文件中每个字段相关联的数据类型分离开来。例如,如果数据文件包含字符表示形式的数据,则相应的 SQL 列类型会丢失。
bcp 命令和 BULK INSERT 语句使用目标表列执行类型转换。因此目标表是必需的。相反,OPENROWSET(BULK...) 函数依赖 XML 格式化文件从数据文件中读取数据。因此目标表是可选的。
允许从数据文件加载包含单一大型对象 (LOB) 数据类型的字段。
格式化文件的语法与操作的方向无关;即大容量导出和大容量导入中使用的语法相同。
有关每种类型的格式化文件的布局信息,请参阅本主题后面的“示例”部分。
何时需要使用格式化文件?
INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句始终要求使用格式化文件。
- 对于 bcp 或 BULK INSERT,在简单情况下,使用格式化文件是可选的,而且很少需要。但是,对于复杂的大容量导入情况,通常都会需要格式化文件。
在以下情况下,必须使用格式化文件:
具有不同架构的多个表使用同一数据文件作为数据源。
数据文件中的字段数不同于目标表中的列数;例如:
目标表中至少包含一个定义了默认值或允许为 NULL 的列。
用户不具有对目标表的一个或多个列的 SELECT/INSERT 权限。
具有不同架构的两个或多个表使用同一个数据文件。
数据文件和表的列顺序不同。
数据文件列的终止字符或前缀长度不同。
注意 |
---|
在缺少格式化文件的情况下,如果 bcp 命令指定了数据格式开关(-n、-c、-w 或 -N),或者 BULK INSERT 操作指定了 DATAFILETYPE 选项,那么指定的数据格式将用作解释数据文件字段的默认方法。 |
示例
下面的示例说明了非 XML 格式化文件和 XML 格式化文件的布局。这些格式化文件对应于 AdventureWorks2008R2 示例数据库中的 HumanResources.myTeam 表。该表包含四列:EmployeeID、Name、Title 和 ModifiedDate。
注意 |
---|
有关该表以及如何创建该表的信息,请参阅创建 HumanResources.myTeam 表。 |
A. 使用非 XML 格式化文件
下面的非 XML 格式化文件为 HumanResources.myTeam 表使用 SQL Server 本机数据格式。此格式化文件是用下面的 bcp 命令创建的。
bcp AdventureWorks2008R2.HumanResources.myTeam format nul -f myTeam.Fmt -n -T
The contents of this format file are as follows: 9.0
4
1 SQLSMALLINT 0 2 "" 1 EmployeeID ""
2 SQLNCHAR 2 100 "" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLNCHAR 2 100 "" 3 Title SQL_Latin1_General_CP1_CI_AS
4 SQLNCHAR 2 100 "" 4 Background SQL_Latin1_General_CP1_CI_AS
有关详细信息,请参阅了解非 XML 格式化文件。
B. 使用 XML 格式化文件
下面的 XML 格式化文件为 HumanResources.myTeam 表使用 SQL Server 本机数据格式。此格式化文件是用下面的 bcp 命令创建的。
bcp AdventureWorks2008R2.HumanResources.myTeam format nul -f myTeam.Xml -x -n -T
格式化文件包含:
<?xml version="1.0"?>
<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="NativePrefix" LENGTH="1"/>
<FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="EmployeeID" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="Name" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Title" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="Background" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
有关详细信息,请参阅了解 XML 格式化文件。