游标是什么? 游标是对数据查询结果集的一种访问机制,用户通过游标可以对结果集进行逐条访问 游标访问的对象是 结果集,也可以称游标为定义在结果集上的指针,控制这个指针可以遍历结果集或特定的行

    游标的作用 定位到结果集的某一行,对当前位置的数据进行读写 缺点:数据读取出来存放在TempDB里,会放到内存,一般来说内存空间有限,不可以太大,所以不适合数据量大的情况,适用于数据量小的情况

    游标的分类? 游标分为:静态游标,动态游标,只进游标,键集驱动游标

    • 静态游标:无论对数据库如何进行操作,结果集都不会变化;如果想让结果集和操作之后的数据保持一致,需要关闭游标,重新打开
    • 动态游标:与静态游标相对,可以前后滚动,在滚动过程中,结果集获取所有的变化,利用游标提取数据时,行数据、顺序、成员都会发生变化,对数据库的操作都通过游标可见。api函数或T-SQL where current of子句通过游标进行更新;游标外部所作的更新直到提交时才可见
    • 只进游标:不支持滚动,只能从头读到尾,对数据库的更新在提取时是可见的,提取后所作的修改不可见

    只进游标:不支持滚动,提取后检测不到数据的变化,消耗的资源相对较少 —只读取数据 静态游标:在滚动时,检测不到表数据的变化,消耗的资源相对较少 —一般用静态游标 动态游标:在滚动时,检测表数据的变化,消耗的资源较多 —性能低

    游标的生命周期 声明—打开—读取数据—关闭游标—释放游标

    1. 1.创建只进游标
    2. --1定义游标
    3. declare user_cursor cursor local --global 全局游标
    4. for
    5. --查询语句
    6. select * from UserId,UserName,Age from UserInfos
    7. where UserId>2
    8. --2打开
    9. open user_cursor
    10. --@varUser 存放单行数据 UserId UserName
    11. declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
    12. set @varUser = user_cursor
    13. --3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
    14. --absolute n 绝对位置第n relative n 从当前位置开始第n
    15. fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
    16. while @@FETCH_STATUS =0 --判断是否执行成功
    17. begin
    18. print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
    19. --验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
    20. if @uId=3
    21. update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
    22. if @uId =27
    23. update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
    24. fetch next from @varUser into @uId,@uName.@uAge
    25. end
    26. --4关闭游标
    27. close user_cursor
    28. --5释放游标
    29. deallocate user_cursor
    1. 2.创建静态游标
    2. --1.定义静态游标 静态游标的结果集不变,对数据库的更新不可见
    3. declare user_cursor_static cursor static local --global 全局游标
    4. for
    5. --查询语句
    6. select * from UserId,UserName,Age from UserInfos
    7. where UserId>2
    8. --2打开
    9. open user_cursor_static
    10. --@varUser 存放单行数据 UserId UserName
    11. declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
    12. set @varUser = user_cursor_static
    13. --3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
    14. --absolute n 绝对位置第n relative n 从当前位置开始第n
    15. fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
    16. while @@FETCH_STATUS =0 --判断是否执行成功
    17. begin
    18. print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
    19. --验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
    20. if @uId=3
    21. update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
    22. if @uId =27
    23. update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
    24. fetch next from @varUser into @uId,@uName.@uAge
    25. end
    26. --4关闭游标
    27. close user_cursor_static
    28. --5释放游标
    29. deallocate user_cursor_static
    1. 3.创建动态游标
    2. --1.定义动态游标 动态游标的结果集是变化的,对数据库的更新是可见的
    3. declare user_cursor_dynamic cursor dynamic local --global 全局游标
    4. for
    5. --查询语句
    6. select * from UserId,UserName,Age from UserInfos
    7. where UserId>2
    8. --2打开
    9. open user_cursor_dynamic
    10. --@varUser 存放单行数据 UserId UserName
    11. declare @varUser cursor,@uId int,@uName varchar(50),@uAge int
    12. set @varUser = user_cursor_dynamic
    13. --3提取数据 next 向上 prior 向上 first 第一个 last 最后一个
    14. --absolute n 绝对位置第n relative n 从当前位置开始第n
    15. fetch next from @varUser into @uId,@uName.@uAge --游标前进 into赋值
    16. while @@FETCH_STATUS =0 --判断是否执行成功
    17. begin
    18. print cast(@uId as varchar) +','+@uName +','+convert(varchar,@uAge)
    19. --验证只进游标不支持滚动,提取时对数据所作的更新是可见的,提取后对数据所作的修改是不可见的
    20. if @uId=3
    21. update UserInfos set Age=25 where UserId =27 --更新未提取的,更新可见
    22. if @uId =27
    23. update UserInfos set Age =29 where UserId =3 --更新已提取过的数据,更新不可见
    24. fetch next from @varUser into @uId,@uName.@uAge
    25. end
    26. --4关闭游标
    27. close user_cursor_dynamic
    28. --5释放游标
    29. deallocate user_cursor_dynamic