SQL 游标知识整理

游标声明格:
declare 游标名称 cursor (游标关键字) for 游标操作对象(select * from 表名称)
游标使用:
open 游标名称;
fetch first from 游标名称 ---遍历游标操作数据对象的第一行
fetch last from 游标名称 --- 获取游标操作数据的最后一行
fetch prior from 游标名称 --- 获取游标操作数据的前一行
fetch next from 游标名称 ---获取游标操作数据的下一行
fetch absolute 数值(用户指定的跳转到第几行的数值) from 游标名称 --- 跳转至用户指定的数据行数
fetch relative 数值(用户指定的相对跳转行数数据) from 游标名称----从当前行开始跳转用户指定的数据行数
close 游标名称 ---关闭游标
deallocate 游标名称 ---释放游标

游标关键字:
local --表示局部游标
global--全局游标 当全局游标和局部游标冲突时系统默认打开局部游标

forward_only ---表示游标遍历数据时只有一个方向
scroll ---表示游标遍历数据时有上下两个方向

static---意味着,当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标的内容.
dynamic ---是和STATIC完全相反的选项,当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch中,数据内容会随之改变
keyset ---将游标所在结果集的唯一能确定每一行的主键存入tempdb,当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET无法探测新加入的数据
fast_forward ---可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好.

read_only --READ_ONLY意味着声明的游标只能读取数据,游标不能做任何更新操作
scroll_locks ---是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功
optimistic ---是相对比较好的一个选择,OPTIMISTIC不锁定任何数据,当需要在游标中更新数据时,如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新

对于游标一些优化建议:
如果能不用游标,尽量不要使用游标用完用完之后一定要关闭和释放尽量不要在大量数据上定义游标尽量不要使用游标上更新数据尽量不要使用insensitive, static和keyset这些参数定义游标如果可以,尽量使用FAST_FORWARD关键字定义游标如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数


游标SQL语句:
游标声明格:
declare 游标名称 cursor (游标关键字) for 游标操作对象(select * from 表名称)
游标使用:
open 游标名称;
fetch first from 游标名称 ---遍历游标操作数据对象的第一行
fetch last from 游标名称 --- 获取游标操作数据的最后一行
fetch prior from 游标名称 --- 获取游标操作数据的前一行
fetch next from 游标名称 ---获取游标操作数据的下一行
fetch absolute 数值(用户指定的跳转到第几行的数值) from 游标名称 --- 跳转至用户指定的数据行数
fetch relative 数值(用户指定的相对跳转行数数据) from 游标名称----从当前行开始跳转用户指定的数据行数
close 游标名称 ---关闭游标
deallocate 游标名称 ---释放游标
  
对于游标一些优化建议
如果能不用游标,尽量不要使用游标用完用完之后一定要关闭和释放尽量不要在大量数据上定义游标尽量不要使用游标上更新数据尽量不要使用insensitive, static和keyset这些参数定义游标如果可以,尽量使用FAST_FORWARD关键字定义游标如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数

原文地址:https://www.cnblogs.com/sunnyblogs/p/3415271.html