1. 程式人生 > 實用技巧 >SQL Server CURSOR遊標使用方法

SQL Server CURSOR遊標使用方法

基本結構

DECLARE Emp_Cursor CURSOR FOR
SELECT EmpID, EmpName FROM Employee
OPEN Emp_Cursor
FETCH NEXT FROM Emp_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
--DO SOMETHING WITH CURSOR
FETCH NEXT FROM Emp_Cursor
END
CLOSE Emp_Cursor
DEALLOCATE Emp_Cursor

關鍵步驟

  1. 宣告遊標:DECLARE [遊標名稱] CURSOR FOR [SELECT語句],FOR後面的查詢結果就是遊標的內容,後續將對其逐行提取;
  2. 開啟遊標:OPEN [遊標名稱],名稱與上文保持統一;
  3. 提取一行:FETCH NEXT FROM [遊標名稱],提取第一步的查詢結果,每執行一次FETCH NEXT依次提取一行;
  4. 判斷狀態:執行一次FETCH NEXT之後,通過系統變數@@FETCH_STATUS指示操作結果:提取成功返回0,失敗返回-1(如已到達最後一行);
  5. 關閉遊標:CLOSE [遊標名稱]
  6. 釋放遊標:DEALLOCATE [遊標名稱]

@@FETCH_STATUS狀態

返回值說明
0 FETCH 語句成功。
-1 FETCH 語句失敗或行不在結果集中。
-2 提取的行不存在。
-9 遊標未執行提取操作。

應用方法

DO SOMETHING WITH CURSOR

一般會將提取到的值賦給變數,用於執行相關任務:

先宣告變數名及型別,然後使用FETCH NEXT FROM Emp_Cursor INTO @A,@B,即可將遊標內容賦給變數@A和@B。

此賦值操作是按列依次賦值給變數的,即第一列的值賦給@A,第二列的值賦給@B。

DECLARE Emp_Cursor CURSOR FOR
SELECT EmpID, EmpName FROM Employee
OPEN Emp_Cursor

DECLARE @A INT
DECLARE @B VARCHAR(20)

FETCH NEXT FROM Emp_Cursor INTO @A,@B

WHILE @@FETCH_STATUS = 0
BEGIN
--DO SOMETHING WITH @A,@B
FETCH NEXT FROM Emp_Cursor INTO @A,@B
END
CLOSE Emp_Cursor
DEALLOCATE Emp_Cursor

在觸發器、儲存過程中使用遊標

遊標常常與觸發器或者儲存過程一起使用。

注意事項

  • WHILE迴圈開始前,執行一次FETCH NEXT;迴圈體結束前,也需要執行一次FETCH NEXT,否則@@FETCH_STATUS並沒有更新。
  • FETCH NEXT已到達最後一行,後續@@FETCH_STATUS會返回-1,但遊標仍然是最後一行資料。
  • 遊標結束前,必須執行CLOSE和DEALLOCATE命令,以關閉和釋放遊標,否則下次建立遊標時出現遊標已存在錯誤。