游標建立後,SQL Server 提供一組系統預存程序供開發者檢視、監控與診斷游標狀態與結構。掌握這些工具對於除錯複雜游標邏輯、分析效能瓶頸至關重要。本文詳細解析四大核心系統預存程序的用法與實戰範例。
| 預存程序 | 功能描述 |
|---|---|
sp_cursor_list |
列出當前作用域內所有游標及其屬性 |
sp_describe_cursor |
顯示指定游標的詳細屬性(類型、捲動性、並行控制等) |
sp_describe_cursor_tables |
顯示游標存取的基礎資料表資訊 |
sp_describe_cursor_columns |
顯示游標結果集的欄位屬性(名稱、型別、長度等) |
sp_cursor_list [@cursor_return =] cursor_variable OUTPUT,
[@cursor_scope =] scope_value
@cursor_return:游標型別輸出參數,接收包含游標清單的結果集游標(必須宣告為 CURSOR 型別變數並加 OUTPUT)@cursor_scope:作用域範圍(1=區域、2=全域、3=兩者皆含)
重要提示:sp_cursor_list本身包含游標型別變數@cursor_return並帶有OUTPUT關鍵字。此變數接收的結果集游標,與被檢查的目標游標(如範例中的pub_cur)是完全不同的兩個游標物件。
sp_describe_cursor [@cursor_return =] cursor_variable OUTPUT,
[@cursor_source =] N'local' | N'global' | N'variable',
[@cursor_identity =] N'cursor_name' | @cursor_variable
reference_name:游標參考名稱cursor_scope:1(區域) / 2(全域)cursor_type:INSENSITIVE、SCROLL、FORWARD_ONLY、DYNAMIC、KEYSET、STATIC 等concurrency_type:READ_ONLY、SCROLL_LOCKS、OPTIMISTICis_open、fetch_status、row_count 等執行狀態資訊sp_describe_cursor_tables 與 sp_describe_cursor_columns 的語法格式與 sp_describe_cursor 完全一致,差別僅在於回傳結果集的焦點:
column_name、data_type、precision、scale、is_nullable、is_identity 等中繼資料cursor_type 與 concurrency_type 確認是否使用高成本游標類型(如 STATIC、KEYSET)sp_describe_cursor_columns 快速掌握游標結果集結構,輔助下游處理邏輯開發sp_describe_cursor_tables 分析游標鎖定的資料表與模式LOCAL 且加上 OUTPUTCLOSE 並 DEALLOCATE 接收結果集的游標,避免洩漏sys.dm_exec_cursors DMV 進行更細緻的執行期監控