一、游标简介
- 定位到结果集的某一行;
- 从当前结果集的位置搜索一行或部分行;
- 允许对结果集中的当前行进行数据修改。
游标根据使用范围不同可以分为全局游标和局部游标,默认为全局游标。
二、实现游标的方法
- T-SQL 游标:主要用于 T-SQL、存储过程和触发器当中。T-SQL 游标的运算操作在服务器上完成,并由接受从客户端发送到服务器的 T-SQL 语句管理。
- API 游标:API 游标幼教应用程序编程接口服务器游标。API 游标也是在服务器上完成操作,每次客户端应用程序调用API游标时,OLEDB 或 ODBC 接口就将这些请求传输到服务器上,由服务器对 API 游标进行操作。
- 客户端游标:客户端游标由SQL Native Client ODBC 驱动程序和实现 ADO API 的 DLL 在客户端内部完成操作。当用客户端应用程序调用到客户端游标时,客户端通过 SQL Native Client ODBC 驱动程序或 ADO DLL 对储存在客户端高速缓存中的结果集执行游标操作。
三、游标的类型
- 静态游标:静态游标的完整的结果集在游标打开时建立在tempdb中,它不反映数据库中所做的更改,只按打开时的原样显示结果集。
- 动态游标:
- 只进游标:
-
游标根据具体的功能又可分为静态游标、动态游标、只进游标、由键值驱动的游标
四、使用游标
DECLARE Cursor_employee CURSOR LOCAL -- 定义的是局部游标,使用 GLOBAL 定义全局游标 FOR SELECT name,age FROM employee -- 定义游标 OPEN Cursor_employee -- 打开游标 DECLARE @name NVARCHAR(15) DECLARE @age INT FETCH NEXT FROM Cursor_employee INTO @name,@age WHILE (@@FETCH_STATUS = 0) BEGIN PRINT 'name: ' + @name PRINT 'age: ' + CAST(@age AS VARCHAR(3)) PRINT '' FETCH NEXT FROM Cursor_employee INTO @name,@age END CLOSE Cursor_employee -- 关闭游标 DEALLOCATE Cursor_employee -- 删除游标,从内存中删除,释放系统资源 DECLARE @cursor_var STATIC CURSOR -- 定义游标变量,指定为静态游标,DIYNAMIC 游标 @@CURSOR_ROWS 总是-1 DECLARE @name NVARCHAR(20) SET @cursor_var = CURSOR FOR SELECT * FROM employee OPEN @cursor_var FETCH NEXT FROM @cursor_var WHERE(@@FETCH_STATUS = 0) BEGIN SELECT @name = name FROM CURRENT OF cursor_var -- 当前行 PRINT @name FETCH NEXT FROM @cursor_var END PRINT '打印静态游标总记录数 @@CURSOR_ROWS:' PRINT @@CURSOR_ROWS CLOSE @cursor_var DEALLOCATE @cursor_var
五、查看游标状态
DECLARE Curosr_Employee CURSOR FOR SELECT * FROM employee OPEN Curosr_Employee DECLARE @cursor_var CURSOR EXEC sp_describe_cursor @cursor_var OUTPUT,N'global','Cursor_Employee' -- 查看游标属性 FETCH @cursor_var CLOSE @cursor_var DEALLOCATE @cursor_var CLOSE Curosr_Employee DEALLOCATE Cursor_Employee -- sp_describe_cursor_columns:查看游标字段属性 -- sp_describe_cursor_tables:查看游标来源数据表 -- sp_cursor_list:查看当前会话中的所有游标属性