游标使用步骤:
(1)游标定义及参数含义:(具体见博客园)
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDA TE [ OF column_name [ ,...n ] ] ]
[;]
LOCAL 和GLOBAL 二选一
LOCAL 意味着游标的生存周期只在批处理或函数或存储过程中可见,而GLOBAL 意味着游标对于特定连接作为上下文
FORW ARD_ONLY 和 SCROLL 二选一
FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL 支持游标在定义的数据集中向任何方向,或任何位置移动
STA TIC KEYSET DYNAMIC 和 FAST_FORWARD 四选一
这四个关键字是游标所在数据集所反应的表内数据和游标读取出的数据的关系
STATIC 意味着,当游标被建立时,将会创建FOR 后面的SELECT 语句所包含数据集的副本存入tempdb 数据库中,任何对于底层表内数据的更改不会影响到游标的内容.
DYNAMIC 是和STATIC 完全相反的选项, 当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch 中,数据内容会随之改变
KEYSET 可以理解为介于STATIC 和DYNAMIC 的折中方案。将游标所在结果集的唯一能确定每一行的主键存入tempdb, 当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET 无法探测新加入的数据
FAST_FORWARD可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好.
READ_ONLY SCROLL_LOCKS OPTIMISTIC 三选一
READ_ONLY意味着声明的游标只能读取数据, 游标不能做任何更新操作
SCROLL_LOCKS是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功
OPTIMISTIC 是相对比较好的一个选择,OPTIMISTIC 不锁定任何数据,当需要在游标中更新数据时, 如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新。
(2)打开游标:
当定义完游标后,游标需要打开后使用,只有简单一行代码: OPEN test_Cursor
注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标。
(3)使用游标:
游标的使用分为两部分, 一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作
只有支持6种移动选项, 分别为到第一行(FIRST ), 最后一行(LAST ), 下一行(NEXT ), 上一行(PRIOR ), 直接跳到某行(ABSOLUTE (n )), 相对于目前跳几行(RELATIVE (n )),
注:这里的移动选项与游标定义时参数有关。
FETCH {6种移动选项} FROM INTO []
(4)关闭游标:
在游标使用完之后,一定要记得关闭, 只需要一行代码:CLOSE+游标名称
CLOSE test_Cursor
(5)释放游标
当游标不再需要被使用后,释放游标,只需要一行代码:DEALLOCATE+游标名称
DEALLOCA TE test_Cursor
对于游标一些优化建议 ∙
∙
∙
∙
∙
∙
∙ 如果能不用游标,尽量不要使用游标 用完用完之后一定要关闭和释放 尽量不要在大量数据上定义游标 尽量不要使用游标上更新数据 尽量不要使用insensitive, static和keyset 这些参数定义游标 如果可以,尽量使用FAST_FORWARD关键字定义游标 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数
游标使用步骤:
(1)游标定义及参数含义:(具体见博客园)
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDA TE [ OF column_name [ ,...n ] ] ]
[;]
LOCAL 和GLOBAL 二选一
LOCAL 意味着游标的生存周期只在批处理或函数或存储过程中可见,而GLOBAL 意味着游标对于特定连接作为上下文
FORW ARD_ONLY 和 SCROLL 二选一
FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL 支持游标在定义的数据集中向任何方向,或任何位置移动
STA TIC KEYSET DYNAMIC 和 FAST_FORWARD 四选一
这四个关键字是游标所在数据集所反应的表内数据和游标读取出的数据的关系
STATIC 意味着,当游标被建立时,将会创建FOR 后面的SELECT 语句所包含数据集的副本存入tempdb 数据库中,任何对于底层表内数据的更改不会影响到游标的内容.
DYNAMIC 是和STATIC 完全相反的选项, 当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch 中,数据内容会随之改变
KEYSET 可以理解为介于STATIC 和DYNAMIC 的折中方案。将游标所在结果集的唯一能确定每一行的主键存入tempdb, 当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET 无法探测新加入的数据
FAST_FORWARD可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好.
READ_ONLY SCROLL_LOCKS OPTIMISTIC 三选一
READ_ONLY意味着声明的游标只能读取数据, 游标不能做任何更新操作
SCROLL_LOCKS是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功
OPTIMISTIC 是相对比较好的一个选择,OPTIMISTIC 不锁定任何数据,当需要在游标中更新数据时, 如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新。
(2)打开游标:
当定义完游标后,游标需要打开后使用,只有简单一行代码: OPEN test_Cursor
注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标。
(3)使用游标:
游标的使用分为两部分, 一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作
只有支持6种移动选项, 分别为到第一行(FIRST ), 最后一行(LAST ), 下一行(NEXT ), 上一行(PRIOR ), 直接跳到某行(ABSOLUTE (n )), 相对于目前跳几行(RELATIVE (n )),
注:这里的移动选项与游标定义时参数有关。
FETCH {6种移动选项} FROM INTO []
(4)关闭游标:
在游标使用完之后,一定要记得关闭, 只需要一行代码:CLOSE+游标名称
CLOSE test_Cursor
(5)释放游标
当游标不再需要被使用后,释放游标,只需要一行代码:DEALLOCATE+游标名称
DEALLOCA TE test_Cursor
对于游标一些优化建议 ∙
∙
∙
∙
∙
∙
∙ 如果能不用游标,尽量不要使用游标 用完用完之后一定要关闭和释放 尽量不要在大量数据上定义游标 尽量不要使用游标上更新数据 尽量不要使用insensitive, static和keyset 这些参数定义游标 如果可以,尽量使用FAST_FORWARD关键字定义游标 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数