Función JetOpenTempTable

Se aplica a: Windows | Windows Server

Función JetOpenTempTable

La función JetOpenTempTable crea una tabla temporal con un único índice. Una tabla temporal almacena y recupera registros igual que una tabla normal creada con JetCreateTableColumnIndex. Sin embargo, las tablas temporales son mucho más rápidas que las tablas normales debido a su naturaleza volátil. También se pueden usar para ordenar y realizar la eliminación de duplicados en conjuntos de registros cuando se accede a ellos de forma puramente secuencial.

    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
    );

Parámetros

sesid

Sesión que se va a usar.

prgcolumndef

Definiciones de columna para las columnas creadas en la tabla temporal.

Existen limitaciones importantes para las opciones de definición de columna que se usan con una tabla temporal. Vea la sección Comentarios para obtener más información.

Además de las opciones de definición de columna habituales, también se pueden especificar cero o más de las opciones siguientes que solo son relevantes en el contexto de una tabla temporal.

Value

Significado

JET_bitColumnTTDescending

El criterio de ordenación de la columna de clave para la tabla temporal debe ser descendente en lugar de ascendente. Si se especifica esta opción sin JET_bitColumnTTKey, esta opción se omite.

JET_bitColumnTTKey

La columna será una columna de clave para la tabla temporal.

El orden de las definiciones de columna con esta opción especificada en la matriz de entrada determinará la prioridad de cada columna de clave para la tabla temporal. La primera definición de columna de la matriz que tiene este conjunto de opciones será la columna de clave más significativa, etc. Si se solicitan más columnas de clave de las que puede admitir el motor de base de datos, esta opción se omite para las columnas de clave no compatibles.

ccolumn

Consulte prgcolumndef.

grbit

Un grupo de bits que especifica cero o más de las siguientes opciones.

Value

Significado

JET_bitTTErrorOnDuplicateInsertion

Cualquier intento de insertar un registro con la misma clave de índice que un registro insertado anteriormente producirá un error inmediatamente con JET_errKeyDuplicate. Si no se solicita esta opción, se detecta un duplicado inmediatamente y se produce un error, o se quita silenciosamente más adelante, en función de la estrategia elegida por el motor de base de datos para implementar la tabla temporal, en función de la funcionalidad solicitada.

Si esta funcionalidad no es necesaria, es mejor no solicitarla. Si no se solicita esta funcionalidad, es posible que el administrador de tablas temporales pueda elegir una estrategia para administrar la tabla temporal que dará como resultado un rendimiento mejorado.

JET_bitTTForceMaterialization

Obliga al administrador de tablas temporales a abandonar la búsqueda de la mejor estrategia para usar la administración de la tabla temporal que dará como resultado un rendimiento mejorado.

JET_bitTTForwardOnly

La tabla temporal solo se crea si el administrador de tablas temporales puede usar la implementación optimizada para los resultados intermedios de la consulta. Si alguna característica de la tabla temporal impediría el uso de esta optimización, se producirá un error en la operación con JET_errCannotMaterializeForwardOnlySort.

Un efecto secundario de esta opción es permitir que la tabla temporal contenga registros con claves de índice duplicadas. Consulte JET_bitTTUnique para obtener más información.

Esta opción solo está disponible en Windows Server 2003 y versiones posteriores.

JET_bitTTIndexed

Esta opción solicita que la tabla temporal sea lo suficientemente flexible como para permitir el uso de JetSeek para buscar registros por clave de índice.

Si esta funcionalidad no es necesaria, es mejor no solicitarla. Si no se solicita esta funcionalidad, es posible que el administrador de tablas temporales pueda elegir una estrategia para administrar la tabla temporal que dará como resultado un rendimiento mejorado.

JET_bitTTUnique

Las solicitudes que registran con claves de índice duplicadas se quitan del conjunto final de registros de la tabla temporal.

Antes de Windows Server 2003, el motor de base de datos siempre supone que esta opción está en vigor debido al hecho de que todos los índices agrupados también deben ser una clave principal y, por tanto, deben ser únicos. A partir de Windows Server 2003, ahora es posible crear una tabla temporal que no quite duplicados cuando también se especifique la opción JET_bitTTForwardOnly.

No es posible saber qué duplicado se realizará correctamente y qué duplicados se descartarán, en general. Sin embargo, cuando se solicita la opción JET_bitTTErrorOnDuplicateInsertion, el primer registro con una clave de índice determinada que se va a insertar en la tabla temporal siempre se realizará correctamente.

JET_bitTTUpdatable

Solicita que la tabla temporal sea lo suficientemente flexible como para permitir que los registros que se hayan insertado previamente se cambien posteriormente. Si esta funcionalidad no es necesaria, es mejor no solicitarla.

Si no se solicita esta funcionalidad, es posible que el administrador de tablas temporales pueda elegir una estrategia para administrar la tabla temporal que dará como resultado un rendimiento mejorado.

JET_bitTTScrollable

Solicita que la tabla temporal sea lo suficientemente flexible como para permitir que los registros se examinen en orden arbitrario y dirección mediante JetMove.

Si esta funcionalidad no es necesaria, es mejor no solicitarla. Si no se solicita esta funcionalidad, es posible que el administrador de tablas temporales pueda elegir una estrategia para administrar la tabla temporal que dará como resultado un rendimiento mejorado.

JET_bitTTSortNullsHigh

Solicita que los valores de columna de clave NULL se ordenan más cerca del final del índice que los valores de columna de clave que no son NULL.

JET_bitTTIntrinsicLVsOnly

Solicitudes para permitir solo valores largos intrínsecos.

Windows 7: JET_bitTTIntrinsicLVsOnly se introduce en Windows 7.

ptableid

Búfer de salida que recibe el nuevo cursor abierto en la tabla temporal recién creada.

prgcolumnid

Búfer de salida que recibe la matriz de identificadores de columna generados durante la creación de la tabla temporal.

Los identificadores de columna de esta matriz se corresponderán exactamente con la matriz de entrada de definiciones de columna. Como resultado, el tamaño de este búfer debe corresponder al tamaño de la matriz de entrada.

Valor devuelto

Esta función devuelve el tipo de datos JET_ERR con uno de los siguientes códigos de retorno. Para obtener más información sobre los posibles errores de ESE, vea Extensible Storage Engine Errors and Error Handling Parameters.

Código devuelto

Descripción

JET_errSuccess

La operación se ha completado correctamente.

JET_errCannotMaterializeForwardOnlySort

Error de JetOpenTempTable porque se especificó JET_bitTTForwardOnly y no se pudo crear la tabla temporal tal como se especificó mediante la optimización de solo avance. Este error solo lo devolverá Windows Server 2003 y versiones posteriores.

JET_errClientRequestToStopJetService

No es posible completar la operación porque toda la actividad de la instancia asociada a la sesión ha dejado de funcionar como resultado de una llamada a JetStopService.

JET_errIndexInvalidDef

No se pudo crear el índice porque se especificó una definición de índice no válida.

JetOpenTempTable devolverá este error cuando:

  • Se especifica la configuración regional neutral del idioma.

  • Se especifica un conjunto no válido de marcas de normalización.

Windows 2000 solo devolverá este error.

JET_errInstanceUnavailable

No es posible completar la operación porque la instancia asociada a la sesión ha encontrado un error irrecuperable que requiere que se revoque el acceso a todos los datos para proteger la integridad de esos datos. Windows XP solo devolverá este error y versiones posteriores.

JET_errInvalidCodePage

El campo cp del JET_COLUMNDEF no se estableció en una página de códigos válida. Los únicos valores válidos para las columnas de texto son Inglés (1252) y Unicode (1200). Un valor de 0 significa que se usará el valor predeterminado (inglés, 1252).

JET_errInvalidColumnType

El campo coltyp del JET_COLUMNDEF no se estableció en un tipo de columna válido.

JET_errInvalidLanguageId

No se pudo crear el índice porque se intentó usar un identificador de configuración regional no válido. Es posible que el identificador de configuración regional no sea válido o que el paquete de idioma asociado no esté instalado.

JET_errInvalidLCMapStringFlags

No se pudo crear el índice porque se intentó usar un conjunto no válido de marcas de normalización. Este error solo lo devolverá Windows XP y versiones posteriores. En Windows 2000, las marcas de normalización no válidas darán lugar a JET_errIndexInvalidDef en su lugar.

JET_errInvalidSesid

El identificador de sesión no es válido o hace referencia a una sesión cerrada.

Nota Este error no se devuelve en todas las circunstancias. Los identificadores solo se validan con el mejor esfuerzo.

JET_errNotInitialized

No es posible completar la operación porque la instancia asociada a la sesión aún no se ha inicializado.

JET_errOutOfCursors

Error en la operación porque el motor no puede asignar los recursos necesarios para abrir un nuevo cursor. Los recursos de cursor se configuran mediante JetSetSystemParameter con JET_paramMaxCursors.

JET_errOutOfMemory

Error en la operación porque no se pudo asignar suficiente memoria para completarla.

JetOpenTempTable puede devolver JET_errOutOfMemory si el espacio de direcciones del proceso host se vuelve demasiado fragmentado. El administrador de tablas temporales siempre asignará un fragmento de 1 MB de espacio de direcciones para cada tabla temporal creada independientemente de la cantidad de datos que se van a almacenar.

JET_errRestoreInProgress

No es posible completar la operación porque una operación de restauración está en curso en la instancia asociada a la sesión.

JET_errSessionSharingViolation

No se puede usar la misma sesión para más de un subproceso al mismo tiempo.

Este error solo lo devolverá Windows XP y versiones posteriores.

JET_errTermInProgress

No es posible completar la operación porque la instancia asociada a la sesión se está cerrando.

JET_errTooManyColumns

Se intentó agregar demasiadas columnas a la tabla. Una tabla no puede tener más de JET_ccolFixedMost columnas fijas, más de JET_ccolVarMost columnas de longitud variable y no más de JET_ccolTaggedMost columnas etiquetadas.

JET_errTooManyOpenIndexes

Error en la operación porque el motor no puede asignar los recursos necesarios para almacenar en caché los índices de la tabla. El número de índices cuyo esquema se puede almacenar en caché se configura mediante JetSetSystemParameter con JET_paramMaxOpenTables.

JET_errTooManyOpenTables

Error en la operación porque el motor no puede asignar los recursos necesarios para almacenar en caché el esquema de la tabla. El número de tablas cuyo esquema se puede almacenar en caché se configura mediante JetSetSystemParameter con JET_paramMaxOpenTables.

JET_errTooManySorts

Error en la operación porque el motor no puede asignar los recursos necesarios para crear una tabla temporal. Los recursos de tabla temporal se configuran mediante JetSetSystemParameter con JET_paramMaxTemporaryTables.

Si se ejecuta correctamente, se devolverá un cursor abierto en la tabla temporal recién creada. El estado de la base de datos temporal se preparará para contener la nueva tabla temporal. El estado de cualquier base de datos normal en uso por el motor de base de datos permanecerá sin cambios.

Si se produce un error, no se creará la tabla temporal y no se devolverá un cursor. Se puede cambiar el estado de la base de datos temporal. El estado de cualquier base de datos normal en uso por el motor de base de datos permanecerá sin cambios.

Comentarios

Las tablas temporales no admiten el complemento completo de las opciones de definición de columna que normalmente son compatibles con el motor de base de datos. De hecho, solo se admiten JET_bitColumnFixed y JET_bitColumnTagged. Esto significa que no es posible crear una columna de incremento automático, versión o multivalor en una tabla temporal. Por último, no se admiten columnas de actualización de custodia porque no son útiles en una tabla temporal, ya que solo pueden usarse en una sesión cada vez. Si se solicita alguna de estas opciones, se omitirán.

Las tablas temporales no admiten valores predeterminados. Si se proporciona una definición de columna que contiene una especificación de valor predeterminada, esa especificación se omitirá.

Las tablas temporales se devuelven al autor de la llamada como resultado de muchas funciones ESE diferentes. Por ejemplo, JetGetIndexInfo con la opción JET_IdxInfo establecida en el parámetro InfoLevel devolverá una tabla temporal que contiene una lista de todas las columnas de clave de un índice determinado. Las tablas temporales siguen las mismas reglas de ciclo de vida que las tablas temporales normales que se describen aquí.

El motor de base de datos también usa tablas temporales internamente para muchas tareas. La más importante de estas tareas es la creación de un índice sobre una tabla existente. Se usará una tabla temporal para ordenar las claves de índice usadas para construir ese índice.

Todas las tablas temporales se almacenan en la base de datos temporal. La base de datos temporal es un archivo de base de datos especial que se mantiene durante la vigencia de una instancia de ESE y se elimina cuando esa instancia se apaga o reinicia. La ubicación de la base de datos temporal se puede configurar mediante JetSetSystemParameter con JET_paramTempPath. La colocación de la base de datos temporal en el disco en relación con los archivos de registro de transacciones y los archivos de base de datos puede ser importante si la aplicación usa con mucha frecuencia tablas temporales o crea índices con frecuencia.

El ciclo de vida de una tabla temporal está asociado a los cursores que hacen referencia a ella. Si se cierran todos los cursores que hacen referencia a una tabla temporal, ya sea implícita o explícitamente, se eliminará la tabla temporal. Si se crea una tabla temporal dentro de una transacción y esa transacción se revierte posteriormente, la tabla temporal se eliminará porque los cursores a los que se hace referencia en este momento se cerrarán implícitamente. Los nuevos cursores pueden hacer referencia a una tabla temporal solo mediante el uso de JetDupCursor. En este caso, los nuevos cursores se colocarán en la primera entrada de índice de la tabla temporal. JetDupCursor solo funcionará durante determinadas fases de uso para la tabla temporal. Consulte los comentarios relativos a las funcionalidades temporales del cursor de tabla para obtener más información. No es posible hacer referencia a una tabla temporal desde más de una sesión a la vez.

Hay un problema importante en JetDupCursor que afecta a las tablas temporales. Si se intenta duplicar una tabla temporal que está en modo de solo avance, el cursor resultante no se creará correctamente y no funcionará correctamente. Todavía es seguro duplicar un cursor sobre una tabla temporal materializada.

El administrador de tablas temporales puede optar por implementar una tabla temporal de tres maneras. El primer método es mantener una tabla en memoria. Esta estrategia es la más rápida, pero solo se puede usar para tablas temporales pequeñas y sencillas. El segundo método consiste en crear una ordenación basada en disco que se puede controlar mediante un iterador de solo avance. Esta estrategia solo se puede usar en determinadas circunstancias y es la manera más rápida de ordenar y quitar duplicados de un conjunto de datos muy grande. El tercer método consiste en crear un árbol B+ en la base de datos temporal para contener la tabla temporal. Esta estrategia es la más lenta, pero la más versátil, y se conoce como una tabla temporal materializada. Estas estrategias se pueden usar en combinación para lograr en última instancia la funcionalidad solicitada de la tabla temporal.

Cuando la tabla temporal no se materializa, se usa principalmente en dos fases principales. La primera fase es la fase de inserción donde la tabla se rellena con su conjunto de datos inicial. Durante esta fase, solo se permite la inserción de datos. Esta fase finaliza cuando se intenta mover el cursor mediante JetMove o JetSeek. La segunda fase es la fase de extracción de datos. Durante esta fase, los datos almacenados en la tabla temporal se pueden extraer según las funcionalidades solicitadas cuando se creó la tabla temporal.

Funcionalidades de cursor de tabla temporal

Cuando se materializa la tabla temporal, el cursor tiene las siguientes funcionalidades, pero puede limitarse aún más por las opciones solicitadas:

Cuando la tabla temporal no se materializa y se encuentra en la fase de inserción, el cursor tiene las siguientes funcionalidades, pero puede estar limitada por las opciones solicitadas:

Cuando la tabla temporal no se materializa y se encuentra en la fase de extracción, el cursor tiene las siguientes funcionalidades, pero puede estar limitada por las opciones solicitadas:

Requisitos

Requisito Value

Cliente

Requiere Windows Vista, Windows XP o Windows 2000 Professional.

Servidor

Requiere Windows Server 2008, Windows Server 2003 o Windows 2000 Server.

Encabezado

Declarado en Esent.h.

Library

Use ESENT.lib.

Archivo DLL

Requiere ESENT.dll.

Consulte también

JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Parámetros de base de datos temporales