JetOpenTempTable 函数
适用于: Windows |Windows Server
JetOpenTempTable 函数
JetOpenTempTable 函数创建具有单个索引的临时表。 临时表存储和检索记录,就像使用 JetCreateTableColumnIndex 创建的普通表一样。 但是,临时表的易失性比普通表快得多。 在以纯顺序方式访问记录集时,它们还可用于非常快速地对记录集进行排序和执行重复删除。
JET_ERR JET_API JetOpenTempTable(
__in JET_SESID sesid,
__in const JET_COLUMNDEF* prgcolumndef,
__in unsigned long ccolumn,
__in JET_GRBIT grbit,
__out JET_TABLEID* ptableid,
__out JET_COLUMNID* prgcolumnid
);
parameters
sesid
要使用的会话。
prgcolumndef
在临时表中创建的列的列定义。
与临时表一起使用的列定义选项存在重要限制。 有关详细信息,请参阅备注部分。
除了常用的列定义选项外,还可以指定仅与临时表上下文相关的以下零个或多个选项。
值 |
含义 |
---|---|
JET_bitColumnTTDescending |
临时表的键列的排序顺序应为降序而不是升序。 如果指定此选项而不JET_bitColumnTTKey则忽略此选项。 |
JET_bitColumnTTKey |
该列将是临时表的键列。 输入数组中指定的此选项的列定义顺序将确定临时表的每个键列的优先级。 数组中设置了此选项的第一个列定义将是最重要的键列等。 如果请求的键列数超过数据库引擎可支持的键列数,则对于不受支持的键列,将忽略此选项。 |
ccolumn
请参阅 prgcolumndef。
grbit
指定以下零个或多个选项的一组位。
值 |
含义 |
---|---|
JET_bitTTErrorOnDuplicateInsertion |
任何尝试插入索引键与之前插入的记录相同的记录都会立即失败,并JET_errKeyDuplicate。 如果未请求此选项,则会立即检测到重复项并失败,或者稍后会以无提示方式删除,具体取决于数据库引擎根据请求的功能选择用于实现临时表的策略。 如果不需要此功能,则最好不要请求此功能。 如果未请求此功能,则临时表管理器可能能够选择一种策略来管理临时表,从而提高性能。 |
JET_bitTTForceMaterialization |
强制临时表管理器放弃搜索最佳策略,以使用管理临时表来提高性能。 |
JET_bitTTForwardOnly |
仅当临时表管理器可以使用针对中间查询结果优化的实现时,才会创建临时表。 如果临时表的任何特征会阻止使用此优化,则操作将失败并JET_errCannotMaterializeForwardOnlySort。 此选项的副作用是允许临时表包含具有重复索引键的记录。 有关详细信息,请参阅JET_bitTTUnique。 此选项仅适用于 Windows Server 2003 及更高版本。 |
JET_bitTTIndexed |
此选项要求临时表足够灵活,以允许使用 JetSeek 按索引键查找记录。 如果不需要此功能,则最好不要请求此功能。 如果未请求此功能,则临时表管理器可能能够选择一种策略来管理临时表,从而提高性能。 |
JET_bitTTUnique |
请求从临时表中的最后一组记录中删除具有重复索引键的记录。 在 Windows Server 2003 之前,数据库引擎始终假定此选项生效,因为所有聚集索引也必须是主键,因此必须是唯一的。 从 Windows Server 2003 开始,现在可以在指定 JET_bitTTForwardOnly 选项时创建不删除重复项的临时表。 一般情况下,无法知道哪个重复项会成功,哪些重复项将被丢弃。 但是,当请求JET_bitTTErrorOnDuplicateInsertion选项时,将始终成功插入临时表中具有给定索引键的第一条记录。 |
JET_bitTTUpdatable |
请求临时表足够灵活,以允许随后更改以前插入的记录。 如果不需要此功能,则最好不要请求此功能。 如果未请求此功能,则临时表管理器可能能够选择一种策略来管理临时表,从而提高性能。 |
JET_bitTTScrollable |
请求临时表足够灵活,以允许使用 JetMove 以任意顺序和方向扫描记录。 如果不需要此功能,则最好不要请求此功能。 如果未请求此功能,则临时表管理器可能能够选择一种策略来管理临时表,从而提高性能。 |
JET_bitTTSortNullsHigh |
请求 NULL 键列值排序比非 NULL 键列值更接近索引末尾。 |
JET_bitTTIntrinsicLVsOnly |
请求仅允许内部长值。 Windows 7:windows 7 中引入了 JET_bitTTIntrinsicLVsOnly 。 |
ptableid
接收在新创建的临时表上打开的新游标的输出缓冲区。
prgcolumnid
接收在创建临时表期间生成的列 ID 数组的输出缓冲区。
此数组中的列 ID 将与列定义的输入数组完全对应。 因此,此缓冲区的大小必须与输入数组的大小相对应。
返回值
此函数返回具有以下返回代码之一 的JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅 可扩展存储引擎错误 和 错误处理参数。
返回代码 |
说明 |
---|---|
JET_errSuccess |
操作已成功完成。 |
JET_errCannotMaterializeForwardOnlySort |
JetOpenTempTable 失败,因为指定了JET_bitTTForwardOnly,并且无法使用仅向前优化创建指定的临时表。 此错误仅由 Windows Server 2003 及更高版本返回。 |
JET_errClientRequestToStopJetService |
无法完成操作,因为与会话关联的实例上的所有活动都因调用 JetStopService 而停止。 |
JET_errIndexInvalidDef |
无法创建索引,因为指定的索引定义无效。 JetOpenTempTable 在以下情况下将返回此错误:
此错误仅由 Windows 2000 返回。 |
JET_errInstanceUnavailable |
无法完成操作,因为与会话关联的实例遇到严重错误,要求撤销对所有数据的访问权限以保护该数据的完整性。 此错误仅由 Windows XP 及更高版本返回。 |
JET_errInvalidCodePage |
JET_COLUMNDEF的 cp 字段未设置为有效的代码页。 文本列的唯一有效值为英语 (1252) 和 Unicode (1200) 。 值为 0 表示将使用默认值 (英语、1252) 。 |
JET_errInvalidColumnType |
JET_COLUMNDEF的 coltyp 字段未设置为有效的列类型。 |
JET_errInvalidLanguageId |
无法创建索引,因为尝试使用无效的区域设置 ID。 区域设置 ID 可能完全无效,或者可能未安装关联的语言包。 |
JET_errInvalidLCMapStringFlags |
无法创建索引,因为尝试使用一组无效的规范化标志。 此错误仅由 Windows XP 和更高版本返回。 在 Windows 2000 上,无效的规范化标志会导致JET_errIndexInvalidDef。 |
JET_errInvalidSesid |
会话句柄无效或引用已关闭的会话。 注意 并非所有情况下都返回此错误。 仅会尽力验证句柄。 |
JET_errNotInitialized |
无法完成操作,因为尚未初始化与会话关联的实例。 |
JET_errOutOfCursors |
操作失败,因为引擎无法分配打开新游标所需的资源。 游标资源是使用 JetSetSystemParameter 和 JET_paramMaxCursors 配置的。 |
JET_errOutOfMemory |
操作失败,因为无法分配足够的内存来完成此操作。 如果主机进程的地址空间过于碎片,JetOpenTempTable 可以返回JET_errOutOfMemory。 无论要存储的数据量如何,临时表管理器始终为每个创建的临时表分配 1MB 的地址空间块。 |
JET_errRestoreInProgress |
无法完成操作,因为正在与会话关联的实例上执行还原操作。 |
JET_errSessionSharingViolation |
同一会话不能同时用于多个线程。 此错误仅由 Windows XP 和更高版本返回。 |
JET_errTermInProgress |
无法完成操作,因为与会话关联的实例正在关闭。 |
JET_errTooManyColumns |
尝试向表添加过多列。 一个表的固定列不能超过 JET_ccolFixedMost,长度不多于JET_ccolVarMost个可变列,并且不能超过JET_ccolTaggedMost个标记列。 |
JET_errTooManyOpenIndexes |
操作失败,因为引擎无法分配缓存表索引所需的资源。 可以使用 具有 JET_paramMaxOpenTables的 JetSetSystemParameter 配置可缓存其架构 的索引数。 |
JET_errTooManyOpenTables |
操作失败,因为引擎无法分配缓存表架构所需的资源。 可以使用 JetSetSystemParameter 和 JET_paramMaxOpenTables 配置其架构的表数。 |
JET_errTooManySorts |
操作失败,因为引擎无法分配创建临时表所需的资源。 使用 JetSetSystemParameter 和 JET_paramMaxTemporaryTables 配置临时表资源。 |
成功后,将返回在新创建的临时表上打开的游标。 临时数据库的状态将准备好包含新的临时表。 数据库引擎使用的任何普通数据库的状态将保持不变。
失败时,不会创建临时表,也不会返回游标。 临时数据库的状态可能会更改。 数据库引擎使用的任何普通数据库的状态将保持不变。
备注
临时表不支持数据库引擎通常支持的列定义选项的完整补充。 事实上,仅支持JET_bitColumnFixed和JET_bitColumnTagged。 这意味着无法在临时表中创建自动递增、版本或多值列。 最后,不支持托管更新列,因为它们在临时表中没有用处,因为它们一次只能由一个会话使用。 如果请求了这些选项中的任何一个,则将忽略它们。
临时表不支持默认值。 如果提供的列定义包含默认值规范,则将忽略该规范。
由于许多不同的 ESE 函数,临时表将返回到调用方。 例如,在 InfoLevel 参数中设置了 JET_IdxInfo 选项的 JetGetIndexInfo 将返回一个临时表,其中包含给定索引中所有键列的列表。 临时表遵循与普通临时表相同的生命周期规则,如此处所述。
临时表也由数据库引擎在内部用于许多任务。 其中最重要的任务是在现有表上创建索引。 临时表将用于对用于构造该索引的索引键进行排序。
所有临时表都存储在临时数据库中。 临时数据库是在 ESE 实例的生存期内维护的特殊数据库文件,在关闭或重新启动该实例时会删除该文件。 可以使用 JetSetSystemParameter 和 JET_paramTempPath 配置临时数据库的位置。 如果应用程序大量使用临时表或频繁创建索引,则相对于事务日志文件和数据库文件在磁盘上放置临时数据库可能很重要。
临时表的生命周期与引用它的游标相关联。 如果引用临时表的所有游标都以隐式或显式方式关闭,则将删除临时表。 如果在事务中创建临时表,并且该事务随后回滚,则将删除临时表,因为此时引用该临时表的任何游标都将隐式关闭。 新游标只能通过使用 JetDupCursor 来引用临时表。 在这种情况下,新游标将定位在临时表的第一个索引项上。 JetDupCursor 仅在临时表的某些使用阶段有效。 有关详细信息,请参阅有关临时表游标功能的备注。 不能一次从多个会话引用临时表。
JetDupCursor 中存在影响临时表的重要问题。 如果尝试复制处于仅向前模式的临时表,则生成的游标将无法正确创建,并且将发生故障。 在具体化临时表上复制光标仍然是安全的。
临时表管理器可以选择通过三种方式实现临时表。 第一种方法是维护内存中表。 此策略速度最快,但只能用于小型、简单的临时表。 第二种方法是创建可以使用仅向前迭代器驱动的基于磁盘的排序。 此策略只能在特定情况下使用,并且是从大型数据集中对重复项进行排序和删除的最快方法。 第三种方法是在临时数据库中创建 B+ 树来保存临时表。 此策略最慢,但用途最广,称为具体化临时表。 这些策略可以结合使用,最终实现临时表请求的功能。
如果临时表未具体化,则主要在两个主要阶段使用它。 第一阶段是插入阶段,其中表填充其初始数据集。 在此阶段,仅允许插入数据。 当尝试使用 JetMove 或 JetSeek 移动光标时,此阶段将结束。 第二个阶段是数据提取阶段。 在此阶段,可以根据创建临时表时请求的功能提取存储在临时表中的数据。
临时表游标功能
具体化临时表时,游标具有以下功能,但可能会受到所请求选项的进一步限制:
当临时表未具体化且处于插入阶段时,游标具有以下功能,但可能会受到所请求选项的进一步限制:
-
注意 导致转换到提取阶段。
-
注意 导致转换到提取阶段。
当临时表未具体化且处于提取阶段时,游标具有以下功能,但可能会受到请求的选项的进一步限制:
-
注意 如果尝试复制处于仅向前模式的临时表,则生成的游标将无法正确创建,并且将发生故障。 将光标复制到具体化临时表上仍然很安全。
要求
要求 | 值 |
---|---|
客户端 |
需要 Windows Vista、Windows XP 或 Windows 2000 专业版。 |
服务器 |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
标头 |
在 Esent.h 中声明。 |
Library |
使用 ESENT.lib。 |
DLL |
需要ESENT.dll。 |
另请参阅
JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
临时数据库参数