基本结构
DECLARE Employee_Cursor CURSOR FOR SELECT EmpID, JobID FROM Employee OPEN Employee_Cursor FETCH NEXT FROM Employee_Cursor WHILE @@FETCH_STATUS = 0 BEGIN --DO SOMETHING WITH CURSOR FETCH NEXT FROM Employee_Cursor END CLOSE Employee_Cursor DEALLOCATE Employee_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 | 游标未执行提取操作。 |
-
注意事项
- WHILE循环开始前,执行一次FETCH NEX;循环体结束前,也需要执行一次FETCH NEXT,否则@@FETCH_STATUS并没有更新。
- 结束前,必须执行CLOSE和DEALLOCATE命令。
- FETCH NEXT已到达最后一行,后续@@FETCH_STATUS会返回-1,但游标仍然是最后一行数据。
应用方法
DO SOMETHING WITH CURSOR
一般会将提取到的值赋给变量,用于执行相关任务。