SQL Server CURSOR遊標使用方法
阿新 • • 發佈:2020-08-04
基本結構
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
關鍵步驟
- 宣告遊標:DECLARE [遊標名稱] CURSOR FOR [SELECT語句],FOR後面的查詢結果就是遊標的內容,後續將對其逐行提取;
- 開啟遊標:OPEN [遊標名稱],名稱與上文保持統一;
- 提取一行:FETCH NEXT FROM [遊標名稱],提取第一步的查詢結果,每執行一次FETCH NEXT依次提取一行;
- 判斷狀態:執行一次FETCH NEXT之後,通過系統變數@@FETCH_STATUS指示操作結果:提取成功返回0,失敗返回-1(如已到達最後一行);
- 關閉遊標:CLOSE [遊標名稱]
- 釋放遊標: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
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命令,以關閉和釋放遊標,否則下次建立遊標時出現遊標已存在錯誤。