JetOpenTempTable-Funktion
Gilt für: Windows | Windows Server
JetOpenTempTable-Funktion
Die JetOpenTempTable-Funktion erstellt eine temporäre Tabelle mit einem einzelnen Index. Eine temporäre Tabelle speichert und ruft Datensätze wie eine normale Tabelle ab, die mit JetCreateTableColumnIndex erstellt wurde. Temporäre Tabellen sind jedoch aufgrund ihrer flüchtigen Natur viel schneller als gewöhnliche Tabellen. Sie können auch verwendet werden, um doppeltes Entfernen von Datensatzsätzen sehr schnell zu sortieren und durchzuführen, wenn auf rein sequenzielle Weise darauf zugegriffen wird.
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
);
Parameter
sesid
Die zu verwendende Sitzung.
prgcolumndef
Spaltendefinitionen für die Spalten, die in der temporären Tabelle erstellt wurden.
Es bestehen wichtige Einschränkungen für die Spaltendefinitionsoptionen, die mit einer temporären Tabelle verwendet werden. Weitere Informationen finden Sie im Abschnitt Hinweise.
Zusätzlich zu den üblichen Spaltendefinitionsoptionen können auch null oder mehr der folgenden Optionen angegeben werden, die nur im Kontext einer temporären Tabelle relevant sind.
Wert |
Bedeutung |
---|---|
JET_bitColumnTTDescending |
Die Sortierreihenfolge der Schlüsselspalte für die temporäre Tabelle sollte absteigend und nicht aufsteigend sein. Wenn diese Option ohne JET_bitColumnTTKey angegeben wird, wird diese Option ignoriert. |
JET_bitColumnTTKey |
Die Spalte ist eine Schlüsselspalte für die temporäre Tabelle. Die Reihenfolge der Spaltendefinitionen mit dieser Option, die im Eingabearray angegeben ist, bestimmt die Rangfolge jeder Schlüsselspalte für die temporäre Tabelle. Die erste Spaltendefinition im Array, für das diese Option festgelegt ist, ist die wichtigste Schlüsselspalte usw. Wenn mehr Schlüsselspalten angefordert werden, als von der Datenbank-Engine unterstützt werden können, wird diese Option für die nicht unterstützten Schlüsselspalten ignoriert. |
ccolumn
Siehe prgcolumndef.
grbit
Eine Gruppe von Bits, die null oder mehr der folgenden Optionen angibt.
Wert |
Bedeutung |
---|---|
JET_bitTTErrorOnDuplicateInsertion |
Jeder Versuch, einen Datensatz mit demselben Indexschlüssel wie ein zuvor eingefügter Datensatz einzufügen, schlägt sofort mit JET_errKeyDuplicate fehl. Wenn diese Option nicht angefordert wird, wird sofort ein Duplikat erkannt, das fehlschlägt oder später automatisch entfernt wird, je nachdem, welche Strategie die Datenbank-Engine für die Implementierung der temporären Tabelle gewählt hat, basierend auf der angeforderten Funktionalität. Wenn diese Funktionalität nicht erforderlich ist, ist es am besten, sie nicht anzufordern. Wenn diese Funktionalität nicht angefordert wird, kann der Manager für temporäre Tabellen möglicherweise eine Strategie für die Verwaltung der temporären Tabelle auswählen, die zu einer verbesserten Leistung führt. |
JET_bitTTForceMaterialization |
Erzwingt den temporären Tabellen-Manager, die Suche nach der besten Strategie für die Verwaltung der temporären Tabelle aufzugeben, was zu einer verbesserten Leistung führt. |
JET_bitTTForwardOnly |
Die temporäre Tabelle wird nur erstellt, wenn der temporäre Tabellen-Manager die Implementierung verwenden kann, die für Zwischenabfrageergebnisse optimiert ist. Wenn ein Merkmal der temporären Tabelle die Verwendung dieser Optimierung verhindern würde, schlägt der Vorgang mit JET_errCannotMaterializeForwardOnlySort fehl. Eine Nebenwirkung dieser Option besteht darin, dass die temporäre Tabelle Datensätze mit doppelten Indexschlüsseln enthält. Weitere Informationen finden Sie unter JET_bitTTUnique. Diese Option ist nur unter Windows Server 2003 und höheren Versionen verfügbar. |
JET_bitTTIndexed |
Diese Option fordert an, dass die temporäre Tabelle flexibel genug ist, um die Verwendung von JetSeek zum Suchen von Datensätzen nach Indexschlüsseln zu ermöglichen. Wenn diese Funktionalität nicht erforderlich ist, ist es am besten, sie nicht anzufordern. Wenn diese Funktionalität nicht angefordert wird, kann der Manager für temporäre Tabellen möglicherweise eine Strategie für die Verwaltung der temporären Tabelle auswählen, die zu einer verbesserten Leistung führt. |
JET_bitTTUnique |
Anforderungen, dass Datensätze mit doppelten Indexschlüsseln aus dem endgültigen Datensatzsatz in der temporären Tabelle entfernt werden. Vor Windows Server 2003 ging die Datenbank-Engine immer davon aus, dass diese Option wirksam ist, da alle gruppierten Indizes ebenfalls ein Primärschlüssel und somit eindeutig sein müssen. Ab Windows Server 2003 ist es jetzt möglich, eine temporäre Tabelle zu erstellen, die keine Duplikate entfernt, wenn auch die Option JET_bitTTForwardOnly angegeben ist. Es ist nicht möglich zu wissen, welche Duplikate erfolgreich sind und welche Duplikate im Allgemeinen verworfen werden. Wenn jedoch die Option JET_bitTTErrorOnDuplicateInsertion angefordert wird, ist der erste Datensatz mit einem bestimmten Indexschlüssel, der in die temporäre Tabelle eingefügt werden soll, immer erfolgreich. |
JET_bitTTUpdatable |
Fordert an, dass die temporäre Tabelle flexibel genug ist, damit datensätze, die zuvor eingefügt wurden, nachträglich geändert werden können. Wenn diese Funktionalität nicht erforderlich ist, ist es am besten, sie nicht anzufordern. Wenn diese Funktionalität nicht angefordert wird, kann der Manager für temporäre Tabellen möglicherweise eine Strategie für die Verwaltung der temporären Tabelle auswählen, die zu einer verbesserten Leistung führt. |
JET_bitTTScrollable |
Fordert an, dass die temporäre Tabelle flexibel genug ist, um das Scannen von Datensätzen in beliebiger Reihenfolge und Richtung mithilfe von JetMove zu ermöglichen. Wenn diese Funktionalität nicht erforderlich ist, ist es am besten, sie nicht anzufordern. Wenn diese Funktionalität nicht angefordert wird, kann der Manager für temporäre Tabellen möglicherweise eine Strategie für die Verwaltung der temporären Tabelle auswählen, die zu einer verbesserten Leistung führt. |
JET_bitTTSortNullsHigh |
Fordert an, dass NULL-Schlüsselspaltenwerte näher am Ende des Indexes sortiert werden als Werte für Schlüsselspalten, die nicht NULL sind. |
JET_bitTTIntrinsicLVsOnly |
Fordert an, nur systeminterne long-Werte zuzulassen. Windows 7: JET_bitTTIntrinsicLVsOnly wird in Windows 7 eingeführt. |
Ptableid
Der Ausgabepuffer, der den neuen Cursor empfängt, der für die neu erstellte temporäre Tabelle geöffnet wurde.
prgcolumnid
Der Ausgabepuffer, der das Array von Spalten-IDs empfängt, die während der Erstellung der temporären Tabelle generiert wurden.
Die Spalten-IDs in diesem Array entsprechen genau dem Eingabearray von Spaltendefinitionen. Daher muss die Größe dieses Puffers der Größe des Eingabearrays entsprechen.
Rückgabewert
Diese Funktion gibt den Datentyp JET_ERR mit einem der folgenden Rückgabecodes zurück. Weitere Informationen zu möglichen ESE-Fehlern finden Sie unter Erweiterbare Speichermodulfehler und Fehlerbehandlungsparameter.
Rückgabecode |
Beschreibung |
---|---|
JET_errSuccess |
Der Vorgang wurde erfolgreich abgeschlossen. |
JET_errCannotMaterializeForwardOnlySort |
JetOpenTempTable ist fehlgeschlagen, weil JET_bitTTForwardOnly angegeben wurde und die angegebene temporäre Tabelle nicht mithilfe der Vorwärtsoptimierung erstellt werden konnte. Dieser Fehler wird nur von Windows Server 2003 und höheren Versionen zurückgegeben. |
JET_errClientRequestToStopJetService |
Es ist nicht möglich, den Vorgang abzuschließen, da alle Aktivitäten auf der instance, die der Sitzung zugeordnet sind, aufgrund eines Aufrufs von JetStopService beendet wurden. |
JET_errIndexInvalidDef |
Der Index konnte nicht erstellt werden, da eine ungültige Indexdefinition angegeben wurde. JetOpenTempTable gibt diesen Fehler in folgenden Fällen zurück:
Dieser Fehler wird nur von Windows 2000 zurückgegeben. |
JET_errInstanceUnavailable |
Es ist nicht möglich, den Vorgang abzuschließen, da für die instance, die der Sitzung zugeordnet ist, ein schwerwiegender Fehler aufgetreten ist, der erfordert, dass der Zugriff auf alle Daten widerrufen wird, um die Integrität dieser Daten zu schützen. Dieser Fehler wird nur von Windows XP und späteren Versionen zurückgegeben. |
JET_errInvalidCodePage |
Das Cp-Feld des JET_COLUMNDEF wurde nicht auf eine gültige Codepage festgelegt. Die einzigen gültigen Werte für Textspalten sind Englisch (1252) und Unicode (1200). Der Wert 0 bedeutet, dass der Standardwert verwendet wird (Englisch, 1252). |
JET_errInvalidColumnType |
Das Coltypfeld des JET_COLUMNDEF wurde nicht auf einen gültigen Spaltentyp festgelegt. |
JET_errInvalidLanguageId |
Der Index konnte nicht erstellt werden, weil versucht wurde, eine ungültige Gebietsschema-ID zu verwenden. Die Gebietsschema-ID ist möglicherweise vollständig ungültig, oder das zugeordnete Sprachpaket ist möglicherweise nicht installiert. |
JET_errInvalidLCMapStringFlags |
Der Index konnte nicht erstellt werden, weil versucht wurde, einen ungültigen Satz von Normalisierungsflags zu verwenden. Dieser Fehler wird nur von Windows XP und späteren Versionen zurückgegeben. Unter Windows 2000 führen ungültige Normalisierungsflags stattdessen zu JET_errIndexInvalidDef. |
JET_errInvalidSesid |
Das Sitzungshandle ist ungültig oder bezieht sich auf eine geschlossene Sitzung. Hinweis Dieser Fehler wird nicht unter allen Umständen zurückgegeben. Handles werden nur auf der Grundlage des bestmöglichen Aufwands überprüft. |
JET_errNotInitialized |
Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance noch nicht initialisiert wurde. |
JET_errOutOfCursors |
Der Vorgang ist fehlgeschlagen, da die Engine die ressourcen nicht zuordnen kann, die zum Öffnen eines neuen Cursors erforderlich sind. Cursorressourcen werden mithilfe von JetSetSystemParameter mit JET_paramMaxCursors konfiguriert. |
JET_errOutOfMemory |
Der Vorgang ist fehlgeschlagen, weil nicht genügend Arbeitsspeicher zugeordnet werden konnte, um ihn abzuschließen. JetOpenTempTable kann JET_errOutOfMemory zurückgeben, wenn der Adressraum des Hostprozesses zu fragmentiert wird. Der temporäre Tabellen-Manager ordnet immer einen Adressraum von 1 MB für jede temporäre Tabelle zu, die erstellt wird, unabhängig von der Menge der zu speichernden Daten. |
JET_errRestoreInProgress |
Es ist nicht möglich, den Vorgang abzuschließen, da ein Wiederherstellungsvorgang für die instance ausgeführt wird, die der Sitzung zugeordnet ist. |
JET_errSessionSharingViolation |
Dieselbe Sitzung kann nicht für mehrere Threads gleichzeitig verwendet werden. Dieser Fehler wird nur von Windows XP und späteren Versionen zurückgegeben. |
JET_errTermInProgress |
Es ist nicht möglich, den Vorgang abzuschließen, da die der Sitzung zugeordnete instance heruntergefahren wird. |
JET_errTooManyColumns |
Es wurde versucht, der Tabelle zu viele Spalten hinzuzufügen. Eine Tabelle darf nicht mehr als JET_ccolFixedMost festen Spalten, nicht mehr als JET_ccolVarMost Spalten mit variabler Länge und nicht mehr als JET_ccolTaggedMost markierten Spalten enthalten. |
JET_errTooManyOpenIndexes |
Der Vorgang ist fehlgeschlagen, da die Engine die Ressourcen nicht zuordnen kann, die zum Zwischenspeichern der Indizes der Tabelle erforderlich sind. Die Anzahl der Indizes, deren Schema zwischengespeichert werden kann, wird mithilfe von JetSetSystemParameter mit JET_paramMaxOpenTables konfiguriert. |
JET_errTooManyOpenTables |
Der Vorgang ist fehlgeschlagen, da die Engine die Ressourcen nicht zuordnen kann, die zum Zwischenspeichern des Schemas der Tabelle erforderlich sind. Die Anzahl der Tabellen, deren Schema zwischengespeichert werden kann, wird mithilfe von JetSetSystemParameter mit JET_paramMaxOpenTables konfiguriert. |
JET_errTooManySorts |
Der Vorgang ist fehlgeschlagen, weil die Engine die zum Erstellen einer temporären Tabelle erforderlichen Ressourcen nicht zuordnen kann. Temporäre Tabellenressourcen werden mithilfe von JetSetSystemParameter mit JET_paramMaxTemporaryTables konfiguriert. |
Bei Erfolg wird ein Cursor zurückgegeben, der für die neu erstellte temporäre Tabelle geöffnet wurde. Der Status der temporären Datenbank wird so vorbereitet, dass die neue temporäre Tabelle enthalten ist. Der Status aller gewöhnlichen Datenbanken, die von der Datenbank-Engine verwendet werden, bleibt unverändert.
Bei einem Fehler wird die temporäre Tabelle nicht erstellt, und ein Cursor wird nicht zurückgegeben. Der Status der temporären Datenbank kann geändert werden. Der Status aller gewöhnlichen Datenbanken, die von der Datenbank-Engine verwendet werden, bleibt unverändert.
Bemerkungen
Temporäre Tabellen unterstützen nicht die vollständige Ergänzung der Spaltendefinitionsoptionen, die normalerweise von der Datenbank-Engine unterstützt werden. Tatsächlich werden nur JET_bitColumnFixed und JET_bitColumnTagged unterstützt. Dies bedeutet, dass es nicht möglich ist, eine automatische Inkrement-, Versions- oder mehrwertige Spalte in einer temporären Tabelle zu erstellen. Schließlich werden Escrowupdatespalten nicht unterstützt, da sie in einer temporären Tabelle nicht nützlich sind, da sie jeweils nur von einer Sitzung verwendet werden können. Wenn eine dieser Optionen angefordert wird, werden sie ignoriert.
Temporäre Tabellen unterstützen keine Standardwerte. Wenn eine Spaltendefinition bereitgestellt wird, die eine Standardwertspezifikation enthält, wird diese Spezifikation ignoriert.
Temporäre Tabellen werden als Ergebnis vieler verschiedener ESE-Funktionen an den Aufrufer zurückgegeben. Beispielsweise gibt JetGetIndexInfo mit der option JET_IdxInfo im InfoLevel-Parameter eine temporäre Tabelle zurück, die eine Liste aller Schlüsselspalten in einem bestimmten Index enthält. Die temporären Tabellen folgen den gleichen Lebenszyklusregeln wie gewöhnliche temporäre Tabellen, wie hier beschrieben.
Temporäre Tabellen werden auch intern von der Datenbank-Engine für viele Aufgaben verwendet. Die wichtigste dieser Aufgaben ist die Erstellung eines Indexes über einer vorhandenen Tabelle. Eine temporäre Tabelle wird verwendet, um die Indexschlüssel zu sortieren, die zum Erstellen dieses Indexes verwendet werden.
Alle temporären Tabellen werden in der temporären Datenbank gespeichert. Die temporäre Datenbank ist eine spezielle Datenbankdatei, die während der Lebensdauer einer ESE-instance verwaltet und gelöscht wird, wenn diese instance heruntergefahren oder neu gestartet wird. Der Speicherort der temporären Datenbank kann mithilfe von JetSetSystemParameter mit JET_paramTempPath konfiguriert werden. Die Platzierung der temporären Datenbank auf dem Datenträger relativ zu Ihren Transaktionsprotokolldateien und Datenbankdateien kann wichtig sein, wenn Ihre Anwendung temporäre Tabellen stark nutzt oder häufig Indizes erstellt.
Der Lebenszyklus einer temporären Tabelle ist an die Cursor gebunden, die darauf verweisen. Wenn alle Cursor, die auf eine temporäre Tabelle verweisen, entweder implizit oder explizit geschlossen werden, wird die temporäre Tabelle gelöscht. Wenn eine temporäre Tabelle innerhalb einer Transaktion erstellt wird und anschließend ein Rollback für diese Transaktion ausgeführt wird, wird die temporäre Tabelle gelöscht, da alle Cursor, die zu diesem Zeitpunkt darauf verwiesen haben, implizit geschlossen werden. Neue Cursor können nur mithilfe von JetDupCursor auf eine temporäre Tabelle verweisen. In diesem Fall werden die neuen Cursor auf dem ersten Indexeintrag der temporären Tabelle positioniert. JetDupCursor funktioniert nur in bestimmten Phasen der Verwendung für die temporäre Tabelle. Weitere Informationen finden Sie in den Hinweisen zu temporären Tabellencursorfunktionen. Es ist nicht möglich, auf eine temporäre Tabelle aus mehreren Sitzungen gleichzeitig zu verweisen.
Es gibt ein wichtiges Problem in JetDupCursor , das sich auf temporäre Tabellen auswirkt. Wenn versucht wird, eine temporäre Tabelle zu duplizieren, die sich im Vorwärtsmodus befindet, wird der resultierende Cursor nicht ordnungsgemäß erstellt und funktioniert nicht. Es ist weiterhin sicher, einen Cursor über eine materialisierte temporäre Tabelle zu duplizieren.
Der Manager für temporäre Tabellen kann eine temporäre Tabelle auf drei Arten implementieren. Die erste Methode besteht darin, eine In-Memory-Tabelle zu verwalten. Diese Strategie ist die schnellste, kann aber nur für kleine, einfache temporäre Tabellen verwendet werden. Die zweite Methode besteht darin, eine datenträgerbasierte Sortierung zu erstellen, die mit einem vorwärtsgerichteten Iterator gesteuert werden kann. Diese Strategie kann nur unter bestimmten Umständen verwendet werden und ist die schnellste Möglichkeit, Duplikate aus einem sehr großen Dataset zu sortieren und zu entfernen. Die dritte Methode besteht darin, eine B+-Struktur in der temporären Datenbank zu erstellen, die die temporäre Tabelle enthält. Diese Strategie ist die langsamste, aber vielseitigste und wird als materialisierte temporäre Tabelle bezeichnet. Diese Strategien können in Kombination verwendet werden, um letztendlich die von der temporären Tabelle angeforderte Funktionalität zu erreichen.
Wenn die temporäre Tabelle nicht materialisiert wird, wird sie in erster Linie in zwei Hauptphasen verwendet. Die erste Phase ist die Einfügephase, in der die Tabelle mit ihrem anfänglichen Dataset aufgefüllt wird. Während dieser Phase ist nur das Einfügen von Daten zulässig. Diese Phase endet, wenn versucht wird, den Cursor mithilfe von JetMove oder JetSeek zu bewegen. Die zweite Phase ist die Datenextraktionsphase. Während dieser Phase können die in der temporären Tabelle gespeicherten Daten gemäß den Funktionen extrahiert werden, die beim Erstellen der temporären Tabelle angefordert wurden.
Funktionen für temporäre Tabellencursor
Wenn die temporäre Tabelle materialisiert wird, verfügt der Cursor über die folgenden Funktionen, kann jedoch durch die angeforderten Optionen weiter eingeschränkt werden:
Wenn die temporäre Tabelle nicht materialisiert wird und sich in der Einfügephase befindet, verfügt der Cursor über die folgenden Funktionen, kann jedoch durch die angeforderten Optionen weiter eingeschränkt werden:
-
Hinweis Bewirkt den Übergang zur Extraktionsphase.
-
Hinweis Bewirkt den Übergang zur Extraktionsphase.
Wenn die temporäre Tabelle nicht materialisiert wird und sich in der Extraktionsphase befindet, verfügt der Cursor über die folgenden Funktionen, kann jedoch durch die angeforderten Optionen weiter eingeschränkt werden:
-
Hinweis Wenn versucht wird, eine temporäre Tabelle zu duplizieren, die sich im Vorwärtsmodus befindet, wird der resultierende Cursor nicht ordnungsgemäß erstellt und funktioniert nicht. Es ist weiterhin sicher, einen Cursor über eine materialisierte temporäre Tabelle zu duplizieren.
Anforderungen
Anforderung | Wert |
---|---|
Client |
Erfordert Windows Vista, Windows XP oder Windows 2000 Professional. |
Server |
Erfordert Windows Server 2008, Windows Server 2003 oder Windows 2000 Server. |
Kopfzeile |
Deklariert in Esent.h. |
Bibliothek |
Verwenden Sie ESENT.lib. |
DLL |
Erfordert ESENT.dll. |
Weitere Informationen
JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Temporäre Datenbankparameter