資料指標

關聯式資料庫中的作業會針對完整的資料列集運作。 例如,SELECT 語句所傳回的數據列集包含滿足 語句 WHERE 子句中條件的所有數據列。 由陳述式傳回的完整資料列稱為結果集。 應用程式 (尤其是互動式線上應用程式) 不一定能夠以一個單位有效地運用整個結果集。 這些應用程式需要一個機制,一次運用一個資料列或小型資料列區塊。 資料指標就是一種結果集的擴充,提供此種機制。

資料指標擴充結果處理的方式是:

  • 允許定位於結果集中的特定資料列。

  • 從結果集的目前位置,擷取一個資料列或資料列區塊。

  • 支援結果集目前位置上資料列的資料修改。

  • 支援以不同可見性層級來檢視其他使用者對結果集所呈現的資料庫資料所作的變更。

  • 讓指令碼、預存程序和觸發程序中的 Transact-SQL 陳述式能夠存取結果集中的資料。

概念

實作資料指標
SQL Server 支援三個資料指標實作。

Transact-SQL 資料指標
以 DECLARE CURSOR 語法為基礎,主要用於 Transact-SQL 腳本、預存程式和觸發程式。 Transact-SQL 資料指標會在伺服器上實作,而且由用戶端傳送給伺服器的 Transact-SQL 陳述式所管理。 資料指標也可存在批次、預存程序或觸發程序內。

應用程式開發介面 (Application Programming Interface,API) 伺服端資料指標
支援 OLE DB 和 ODBC 中的 API 資料指標函式。 API 伺服端資料指標實作在伺服端上。 每次用戶端應用程式呼叫 API 資料指標函數時,SQL Server Native Client OLE DB 提供者或 ODBC 驅動程式都會將要求傳遞至伺服器,以依照 API 伺服端資料指標執行。

用戶端資料指標
由 SQL Server Native Client ODBC 驅動程式和實作 ADO API 的 DLL 在內部實作。 用戶端資料指標是透過快取用戶端上的整個結果集資料列來實作。 每次用戶端應用程式呼叫 API 資料指標函數時,SQL Server Native Client ODBC 驅動程式或 ADO DLL 都會在用戶端上快取的結果集資料列上執行資料指標作業。

資料指標的類型
順向
僅限正向數據指標不支援卷動;它只支援從數據指標開頭到結尾串行化擷取數據列。 提取資料列之前,不會從資料庫擷取那些資料列。 從數據指標擷取數據列時,目前使用者或其他使用者所認可的所有 INSERT、UPDATE 和 DELETE 語句的效果都會顯示。

因為無法逆向捲動資料指標,提取資料列之後對資料庫中資料列所進行的大部分變更,都無法經由資料指標看見。 如果已修改用來判斷結果集之資料列位置的值 (例如更新叢集索引所涵蓋的資料行),就可以經由資料指標看到修改的值。

雖然資料庫 API 資料指標模型會將順向資料指標視為不同的資料指標類型,但是 SQL Server 並不會。 SQL Server 會將順向和捲動視為可以套用至靜態、索引鍵集驅動和動態資料指標的選項。 Transact-SQL 資料指標支援順向、靜態、索引鍵集驅動和動態資料指標。 資料庫 API 資料指標模式會假設靜態、索引鍵集驅動和動態資料指標一律可以捲動。 當資料庫 API 資料指標屬性 (Attribute 或 Property) 設為順向時,SQL Server 會將此資料指標實作為順向動態資料指標。

靜態
資料指標開啟時,靜態資料指標的完整結果集會內建於 tempdb 。 資料指標開啟的同時,靜態資料指標會將結果集的原貌展現出來。 靜態資料指標可以偵測少量的變更或是沒有變更,但是在捲動時所耗用的資源相當少。

即使資料庫中的變更影響結果集的成員資格,或構成結果集的資料列之資料行數值有所變動時,此類資料指標並不會反映出其中的變更。 靜態數據指標不會在開啟數據指標之後顯示插入資料庫中的新數據列,即使它們符合數據指標 SELECT 語句的搜尋條件也一樣。 如果構成結果集的資料列被其他使用者更新,新資料值不會顯示在靜態資料指標上。 靜態資料指標會顯示資料指標開啟後從資料庫刪除的資料列。 靜態數據指標中不會反映UPDATE、INSERT或DELETE作業(除非數據指標已關閉並重新開啟),甚至不會使用開啟數據指標的相同連接進行修改。

SQL Server 靜態資料指標永遠是唯讀的。

由於靜態數據指標的結果集儲存在tempdb的工作數據表中,因此結果集中的數據列大小不能超過SQL Server數據表的數據列大小上限。

Transact-SQL 對靜態資料指標使用了術語不敏感。 部分資料庫 API 會將它們識別為快照集資料指標。

索引鍵集
開啟資料指標時,索引鍵集驅動資料指標中的成員資格和資料列順序是固定的。 索引鍵集驅動資料指標是由一組唯一的識別碼、索引鍵 (稱為索引鍵集) 所控制。 索引鍵是從結果集中唯一識別資料列的一組資料行建立的。 索引鍵集是開啟數據指標時,所有符合 SELECT 語句之數據列的索引鍵值集。 開啟資料指標時,會在 tempdb 中建立索引鍵集驅動資料指標的索引鍵集。

動態
動態資料指標是靜態資料指標的相反。 捲動資料指標時,動態資料指標會反映其結果集中資料列的所有變更。 每回擷取時結果集之中資料列的資料值、順序和成員均會變動。 所有使用者所做的所有UPDATE、INSERT和DELETE語句都會透過資料指標顯示。 如果使用 SQLSetPos 或 Transact-SQL WHERE CURRENT OF 子句等 API 函式,透過數據指標進行更新,就會立即顯示更新。 至於資料指標外的更新必須經過認可後才看得見,除非資料指標交易隔離等級設定為讀取未認可。 動態資料指標計劃一律不會使用空間索引。

要求資料指標

SQL Server 支援兩種要求資料指標的方法:

  • Transact-SQL

    Transact-SQL 語言支援使用以 ISO 資料指標語法為模型的資料指標的語法。

  • 資料庫應用程式開發介面 (API) 資料指標函數

    SQL Server 支援以下資料庫 API 的資料指標功能:

    • ADO (Microsoft ActiveX Data Object)

    • OLE DB

    • ODBC (開放式資料庫連接)

應用程式不應將兩種要求資料指標的方法混合。 使用 API 指定資料指標行為的應用程式也不應執行 Transact-SQL DECLARE CURSOR 陳述式來要求 Transact-SQL 資料指標。 如果應用程式已將所有 API 資料指標屬性設回其預設值,只應執行 DECLARE CURSOR。

如果沒有要求 Transact-SQL 或 API 資料指標,SQL Server 預設會傳回完整的結果集 (亦即預設結果集) 給應用程式。

資料指標處理過程

Transact-SQL 資料指標和 API 資料指標具有不同的語法,但是下列一般處理過程適用於所有的 SQL Server 資料指標:

  1. 使資料指標與 Transact-SQL 陳述式的結果集建立關聯,並定義資料指標的特性,例如可否更新資料指標中的資料列。

  2. 執行 Transact-SQL 陳述式,以填入資料指標。

  3. 擷取資料指標中您要檢視的資料列。 從資料指標擷取一個資料列或資料列區塊的作業稱為擷取 (Fetch)。 以順向 (Forward) 或逆向 (Backward) 擷取資料列的一系列擷取作業,稱為捲動 (Scroll)。

  4. 選擇性地在資料指標目前位置上的資料列執行修改作業 (更新或刪除)。

  5. 關閉資料指標。

資料指標如何實作資料指標的行為

另請參閱

DECLARE CURSOR (Transact-SQL)
資料指標 (Transact-SQL)
資料指標函數 (Transact-SQL)
資料指標預存程序 (Transact-SQL)