Transact-SQL 游標
基於 DECLARE CURSOR 語法,主要用於 Transact-SQL 腳本、存儲過程和觸發器。Transact-SQL 游標在服務器上實現並由從客戶端發送到服務器的 Transact-SQL 語句管理。它們還可能包含在批處理、存儲過程或觸發器中。
應用程序編程接口 (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 會對客戶端上高速緩存的結果集行執行游標操作。
由於 Transact-SQL 游標和 API 服務器游標都在服務器上實現,所以它們統稱為服務器游標。
不要混合使用這些不同類型的游標。如果從一個應用程序中執行 DECLARE CURSOR 和 OPEN 語句,請首先將 API 游標屬性設置為默認值。否則就會要求 SQL Server 將 API 游標映射到 Transact-SQL 游標。例如,不要將 ODBC 屬性設置為需要將由鍵集驅動的游標映射到結果集,然後使用該語句句柄執行 DECLARE CURSOR 和 OPEN 以調用 INSENSITIVE 游標。
服務器游標的一個潛在缺點是它們目前並不支持所有的 Transact-SQL 語句。服務器游標不支持生成多個結果集的 Transact-SQL 語句,因此,當應用程序執行包含多個 SELECT 語句的存儲過程或批處理時,不能使用服務器游標。服務器游標也不支持包含 COMPUTE、COMPUTE BY、FOR BROWSE 或 INTO 關鍵字的 SQL 語句。
服務器游標與默認結果集的比較
使用游標不如使用默認結果集的效率高。在默認結果集中,從客戶端發送到服務器的唯一數據包是包含待執行語句的數據包。而在使用服務器游標時,每個 FETCH 語句都必須從客戶端發送到服務器,然後在服務器上分析並編譯為執行計劃。
如果某個 Transact-SQL 語句將返回一個相對較小的結果集,可以高速緩存在客戶端應用程序可用的內存中,而且您知道必須在執行該語句之前檢索整個結果集,那麼請使用默認結果集。只有在需要進行游標操作以支持應用程序的功能,或者可能只需檢索結果集的一部分時,才應使用服務器游標。
服務器游標與客戶端游標的比較
用服務器游標代替客戶端游標有以下幾個優點:
1.性能
在訪問游標中的部分數據時(這在許多浏覽應用程序中很常見),使用服務器游標能夠提供最佳的性能,因為只通過網絡發送提取的數據。客戶端游標則將整個結果集高速緩存在客戶端。
2.其他游標類型
如果 SQL Server Native ClIEnt ODBC 驅動程序只使用客戶端游標,它可能只支持只進游標和靜態游標。通過使用 API 服務器游標,該驅動程序也可以支持由鍵集驅動的游標和動態游標。SQL Server 還支持只有通過服務器游標才能獲得的所有游標並發屬性。客戶端游標僅限於它們所支持的功能。
3.更精確的定位更新
服務器游標直接支持定位操作,例如 ODBC 的 SQLSetPos 函數,或帶有 WHERE CURRENT OF 子句的 UPDATE 和 DELETE 語句。另一方面,通過生成 Transact-SQL 搜索的 UPDATE 語句,客戶端游標可以模擬定位游標更新,如果有多個行滿足 UPDATE 語句的 WHERE 子句的條件,這將導致意外更新。
4.內存使用
在使用服務器游標時,客戶端無需高速緩存大量數據或維護游標位置的信息,因為這些工作由服務器完成。
5.多個活動語句
使用服務器游標時,結果不會存留在游標操作之間的連接上。這就允許同時擁有多個基於游標的活動語句。
除了靜態游標或不敏感游標外,所有服務器游標的操作都取決於基礎表的架構。聲明游標後對這些表的架構進行任何更改都將導致該游標的後續操作發生錯誤。