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

SQL Server OPEN 游標機制詳解:全域/區域作用域、臨時表生成與 @@CURSOR_ROWS 非同步讀取行數追蹤

     編輯:關於SqlServer

游標宣告後,必須用 OPEN 命令開啟才能讀取資料。語法:

OPEN { { [GLOBAL] cursor_name } | cursor_variable_name }

參數說明

  • GLOBAL:定義為全域游標
  • cursor_name:宣告的游標名稱。同名全域與區域游標共存時,GLOBAL 指定全域,否則為區域
  • cursor_variable_name:游標變數

OPEN 執行內部機制

  • 優先檢查宣告語法正確性,若含變數則帶入變數值
  • 宣告使用 INSENSITIVE 或 STATIC 時,OPEN 產生臨時表儲存結果集(位於 tempdb)
  • 若結果集任一行大小超過 SQL Server 最大行尺寸,OPEN 失敗
  • 使用 KEYSET 選項時,OPEN 在 tempdb 建立臨時表儲存鍵值

@@CURSOR_ROWS 全域變數:非同步讀取行數追蹤

游標成功開啟後,@@CURSOR_ROWS 記錄游標內資料行數。為提升效能,SQL Server 允許非同步方式從基礎表向 KEYSET 或靜態游標讀入資料:

  • 若查詢優化器估計返回行數超過 sp_configure cursor threshold 參數值
  • SQL Server 啟動獨立執行緒持續從基礎表讀入符合條件的行
  • 此時可從游標讀取資料處理,無需等待所有資料讀入完成
  • @@CURSOR_ROWS 儲存調用時刻游標已從基礎表讀入的行數

@@CURSOR_ROWS 四種返回值對照

(註:原文圖片引用為表 13-1,此處為佔位符)

若宣告帶 SCROLL 或 INSENSITIVE,@@CURSOR_ROWS 為正數且等於所有資料行;未加這兩保留字則值為 -1,表示游標僅有一條記錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved