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:
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:
-
Nota Provoca la transición a la fase de extracción.
-
Nota Provoca la transición a la fase de extracción.
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:
-
Nota 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.
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