共用方式為


JetIntersectIndexes 函式

適用于: Windows |Windows Server

JetIntersectIndexes 函式

JetIntersectIndexes函式會計算相同資料表上不同次要索引項目目的多個索引項目目集合之間的交集。 此作業適用于尋找資料表中符合兩個或多個準則的記錄集,這些準則可使用索引範圍來表示。

    JET_ERR JET_API JetIntersectIndexes(
      __in          JET_SESID sesid,
      __in          JET_INDEXRANGE* rgindexrange,
      __in          unsigned long cindexrange,
      __in_out      JET_RECORDLIST* precordlist,
      __in          JET_GRBIT grbit
    );

參數

sesid

要用於這個呼叫的會話。

rgindexrange

JET_IndexRange結構的陣列指標。 每個結構都包含 一個JET_TABLEID ,其已設定為保留要交集的其中一個索引範圍。 如需詳細資訊,請參閱 JET_IndexRange

cindexrange

陣列中包含在rgindexrange參數中的JET_IndexRange結構數目。

precordlist

JET_RECORDLIST結構的指標。 此結構會填入足夠的資訊,以周遊臨時表與 JetIntersectIndexes的結果。

接收 JET_RECORDLIST 結構的輸出緩衝區。 結構包含交集結果集的描述。

grbit

保留供未來使用。

傳回值

此函式會傳回具有下列其中一個傳回碼 的 JET_ERR 資料類型。 如需 ESE 錯誤的詳細資訊,請參閱 可延伸儲存引擎錯誤錯誤處理參數

傳回碼

Description

JET_errSuccess

作業已成功完成。

JET_errClientRequestToStopJetService

無法完成作業,因為與會話相關聯之實例上的所有活動因 JetStopService呼叫而停止。

JET_errInstanceUnavailable

無法完成作業,因為與會話相關聯的實例發生嚴重錯誤,需要撤銷所有資料的存取權,以保護該資料的完整性。

Windowsxp: 這個傳回值是在 Windows XP 中引進。

JET_errInvalidgrbit

要求的其中一個選項無效、未正確使用或未實作。

當下列情況時,JetIntersectIndexes會傳回此錯誤:

rgindexrange陣列中任何元素所指向之JET_IndexRange結構中包含的grbit不等於JET_bitRecordInIndex。

JET_errInvalidParameter

提供的其中一個參數包含非預期的值,或與另一個參數的值結合時不一致的值。

JetIntersectIndexes基於下列原因而傳回此錯誤:

  • precordlist參數為 Null。

  • precordlist參數中所指定JET_RECORDLIST結構的cbStruct成員不等於JET_RECORDLIST結構的大小。

  • cindexrange參數為零。

  • cindexrange參數大於 64。

  • rgindexrange參數所指定陣列中任何元素的cbStruct成員不等於JET_IndexRange結構的大小。

  • rgindexrange陣列中的元素包含來自不同資料表的 JET_TABLEID

  • rgindexrange陣列中的專案包含未位於次要索引上的JET_TABLEID

  • rgindexrange陣列中的一或多個元素包含位於相同次要索引上的JET_TABLEID

JET_errInvalidSesid

會話控制碼無效或參考已關閉的會話。

在所有情況下都不會傳回此錯誤。 控制碼只會以最佳方式進行驗證。

JET_errNotInitialized

無法完成作業,因為與會話相關聯的實例尚未初始化。

JET_errOutOfCursors

作業失敗,因為引擎無法配置開啟新資料指標所需的資源。 資料指標資源是藉由呼叫JetSetSystemParameter,並在paramid參數中指定JET_paramMaxCursors

JET_errOutOfMemory

作業失敗,因為無法配置足夠的記憶體來完成。

如果主機進程的位址空間太分散,JetIntersectIndexes可以傳回JET_errOutOfMemory。 不論要儲存的資料量為何,臨時表管理員一律會為每個建立的臨時表配置 1MB 的位址空間。 JetIntersectIndexes會針對rgindexrange參數中指定的每個JET_IndexRange建立一個臨時表,並為JET_RECORDLIST中的輸出建立一個臨時表。

JET_errRestoreInProgress

無法完成作業,因為與會話相關聯的實例上正在進行還原作業。

JET_errSessionSharingViolation

從多個執行緒同時使用相同的會話不合法。

Windowsxp: 這個傳回值是在 Windows XP 中引進。

JET_errTermInProgress

無法完成作業,因為與會話相關聯的實例正在關閉。

JET_errTooManyOpenIndexes

作業失敗,因為引擎無法配置快取資料表索引所需的資源。 您可以使用JetSetSystemParameter搭配參數中指定的JET_paramMaxOpenTables,來設定可快取其架構的索引數目。

JET_errTooManyOpenTables

作業失敗,因為引擎無法配置快取資料表架構所需的資源。 可以使用JetSetSystemParameter設定其架構的資料表數目,並在paramid參數中指定JET_paramMaxOpenTables

JET_errTooManySorts

作業失敗,因為引擎無法配置建立臨時表所需的資源。 臨時表資源是使用 JetSetSystemParameter 來設定,並在 paramid 參數中指定JET_paramMaxTemporaryTables。

成功時,會傳回新的臨時表,其中包含符合每個輸入索引範圍描述所代表準則的記錄書簽。

失敗時,將不會建立包含結果的臨時表。 暫存資料庫的狀態可能會變更。 資料庫引擎使用中任何一般資料庫的狀態會保持不變。 提供給此函式 之JET_TABLEID的目前位置可能會變更。

備註

JetIntersectIndexes 可用來有效率地依多個準則篩選資料表中的記錄,如果這些準則可以用該資料表的次要索引來表示。 例如,假設您有一個非常大型的資料表,其中包含人員。 資料表可以有其使用者識別碼、名字、姓氏等資料行。 假設每一個資料行分別編制索引,而且資料表的主要索引超過使用者識別碼。如果您想要尋找名字開頭為 A 且姓氏開頭為 G 的每個人,您可以執行下列步驟:

  1. 在資料表上開啟新的資料指標,並將該資料指標設定為使用 「名字」資料行上的索引。 然後為開頭為 'A' 的所有人員設定索引範圍,並建置包含此資料指標 的JET_IndexRange 結構。

  2. 針對 「last name」 開頭為 'G' 的所有人員,重複步驟 1,並在 「last name」 索引上加上新的資料指標。

  3. 將這些準則傳遞至 JetIntersectIndexes ,以將結果計算為臨時表。

  4. 周遊臨時表,並擷取依書簽傳遞準則的每個記錄。

包含結果集的臨時表是包含一個資料行的簡單資料表,其中包含每個記錄的書簽,這些記錄會傳遞用來計算交集的所有準則。 結果集會以與主要索引相同的順序排序,而且不包含重複的專案。 應用程式可以列舉臨時表中的資料列、使用 JetRetrieveColumn 擷取每個結果的書簽,然後使用 JetRetrieveColumn呼叫 JetGotoBookmark 來流覽資料庫中的記錄,並在位於主索引的資料指標上呼叫該書簽來列舉交集的結果。

JetIntersectIndexes傳回的臨時表只能以正向掃描。 掃描完成時,也應該透過 JetCloseTable 關閉。 如需臨時表及其運作方式的詳細資訊,請參閱 JetOpenTemporaryTable

JetIntersectIndexes 通常是一種有效率且方便的方式,可根據多個索引準則篩選記錄。 不過,有一些應該遵循的重要秘訣,以最大化此功能的實用性。 如果您知道其中一個準則的限制如此嚴格,因為產生的索引範圍有非常少的記錄,則最好只是逐步執行該索引範圍,並在應用層級篩選記錄。 此外,如果您知道您有比交集中其他準則更嚴格的準則,您可能會考慮從交集卸載那些較不嚴格的準則。 最後,如果您知道其中一個準則完全沒有限制,因此產生的索引範圍幾乎與主要索引相同,則與該索引範圍交集的比較不太可能會受益, (減少結果集) 的大小。 在所有情況下,您應該以在輸入上採用最少可能索引項目目的方式選取準則,並在輸出上產生最特定的書簽集,以達到最大效能。

規格需求

需求

用戶端

需要 Windows Vista、Windows XP 或 Windows 2000 Professional。

Server

需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。

標頭

在 Esent.h 中宣告。

程式庫

使用 ESENT.lib。

Dll

需要ESENT.dll。

另請參閱

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange