首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 兩種要求游標方式:Transact-SQL 與 API 游標函數

     編輯:關於SqlServer

游標基本概念

游標是系統為使用者開設的資料緩衝區,儲存 SQL 陳述式執行結果。關聯式資料庫操作針對整個結果集,但應用程式常需逐列或分批處理。游標提供定位特定列、逐列擷取、定位更新/刪除、可見性控制等機制,擴展結果集處理能力。

兩種要求游標的方法

方法語法/介面適用層級
Transact-SQL 游標DECLARE CURSOR ISO 擴充語法指令碼、預存程序、觸發器(伺服器端)
API 游標函數ODBC、OLE DB、ADO 提供的游標 API應用程式(C#、VB、C++ 等)

互斥規則

應用程式不可混用兩種方式。若已透過 API 設定游標行為(如 SQLSetStmtAttr 設定游標類型),隨後執行 DECLARE CURSOR 會要求 SQL Server 將 API 游標對應至 T-SQL 游標,導致未定義行為。正確順序:先將所有 API 游標屬性重設為預設值,再使用 T-SQL 游標;或反之。

預設結果集

若兩種方式皆未要求,SQL Server 回傳預設結果集:單一網路往返串流傳輸,效率最高,適用於一次性完整讀取場景。

游標通用生命週期(五步驟)

  1. 關聯與定義:將游標繫結至查詢結果集,指定特性(可捲動、可更新、並行控制等)。
  2. 開啟:執行查詢填入游標。
  3. 擷取:從游標取回一列或一批列(FETCH),支援前向/後向捲動。
  4. 修改(選擇性):對目前位置列執行 UPDATE/DELETE WHERE CURRENT OF。
  5. 關閉:釋放游標資源(CLOSE),必要時 DEALLOCATE 移除定義。

API 游標支援的介面

  • ADO (ActiveX Data Objects):Recordset 物件,CursorLocation、CursorType、LockType 屬性控制。
  • OLE DB:IRowsetScroll、IRowsetChange、IRowsetUpdate 介面。
  • ODBC:SQLSetStmtAttr 設定 SQL_ATTR_CURSOR_TYPE、SQL_ATTR_CONCURRENCY,SQLFetchScroll、SQLSetPos 操作。

實務建議

  • 優先使用集合式操作(單一 SQL 陳述式),避免游標逐列處理的效能代價。
  • 必須用游標時:伺服器端邏輯用 T-SQL 游標,應用層互動用 API 游標,兩者勿混。
  • 僅需前向讀取、無更新 → 選 FORWARD_ONLY / READ_ONLY 游標,開銷最小。
  • 需定位更新 → 確保基礎表有主鍵/唯一索引,使用 WHERE CURRENT OF 或 SQLSetPos。
  • 及時 CLOSE / DEALLOCATE 釋放伺服器資源(鎖、記憶體、TempDB 工作表)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved