1. 定义游标
在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.
游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以Select开始的数据集上的。
T-SQL中的游标定义在MSDN中如下:
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 UPDATE [ OF column_name [ ,...n ] ] ]
[;]
看起来很让人头痛是吧.下面仔细讲一下如何定义游标:
游标分为游标类型和游标变量,对于游标变量来说,遵循T-SQL变量的定义方法.
游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,两种定义方式如下:
--定义后直接赋值
declare test_Cursor cursor for
select * from tb1
--先定义后赋值
declare @test_Cursor cursor
set @test_Cursor = cursor for
select * from tb1
下面我们来看游标定义的参数:
-
LOCAL和GLOBAL二选一
LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,而GLOBAL意味着游标对于特定连接作为上下文,全局内有效。
如果不指定游标作用域,默认作用域为GLOBAL
-
FORWARD_ONLY 和 SCROLL 二选一
FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动。
-
STATIC 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. 打开游标
当定义完游标后,游标需要打开后使用,只有简单一行代码:
注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标
3. 使用游标
游标的使用分为两部分,一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作
只有支持6种移动选项,分别为到第一行(FIRST),最后一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某行(ABSOLUTE(n)),相对于目前跳几行(RELATIVE(n))
declare my_cursor cursor scroll dynamic
/*scroll表示可随意移动游标指针(否则只能向前),dynamic表示可以读写游标(否则游标只读)*/
for
select [name] from t_msg
open my_cursor
declare @name sysname
fetch next from my_cursor into @name
while(@@fetch_status=0)
begin
print 'UserName: ' + @name
--fetch next from my_cursor
fetch next from my_cursor into @name
end
--fetch first from my_cursor into @name
print @name
/* update 个人资料 set 姓名='zzg' where current of my_cursor */
/* delete from 个人资料 where current of my_cursor */
close my_cursor
deallocate my_cursor
4. 关闭游标
CLOSE test_Cursor
5. 释放游标
当游标不再需要被使用后,释放游标,只需要一行代码:DEALLOCATE+游标名称
转自:(向原作者致敬)
http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
http://blog.csdn.net/feng2375/article/details/2063551
分享到:
相关推荐
SQL Server2000游标例子 SQL Server2000游标例子
sql server 游标实例sql server 游标实例sql server 游标实例sql server 游标实例
一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...
游标循环数据库,游标循环数据库游标循环数据库游标循环数据库
SQL Server 游标用法 , 游标 Demo
Sqlserver游标拼接学习,简单的游标学习,直接exec执行查看结果
sql server 事务和游标 能有效的处理一些平时不能处理的问题!
SqlServer存储过程、游标讲解SqlServer存储过程、游标讲解
此资料可以帮助没有用过数据库游标和函数的朋友学会去用它,只要跟着做一遍就会使用啦,这样就在设计数据库时可以充分灵活运用游标和函数
SQL Server 事务 游标 基本语法操作实例 全SQL语句
Ø 事务 在数据库中有时候需要把多个步骤的... 事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给数据库系统,执行时,这组指令要么全部执行完成,要么全部取消。因此,事务是一个不可分割的逻辑单元。
sql server 游标试用方法 例子
sql server 游标 使用的使用方法 --读取数据(使用FETCH来获取该记录的值;FETCH会执行两步操作:首先将游标当前指向的记录保存到一个局部变量中, --然后游标将自动移向下一条记录) --将一条或多条记录读入某个...
sql server 游标范例,多个demo基本涵盖了游标的使用技巧
在sql中,通过id查询出一个字段的值ordernumber,利用游标循环遍历对应字段的值ordernumber1,(比较ordernumber是否存在,存在就在后+'_1',+'_2'...)
SqlServer存储过程游标 ,一个例子
完整的SQL SERVER双层游标嵌套示例
sqlserver游标的写法例子,sqlserver游标的写法例子,
SQLServer 存储过程 游标的使用方法 事务的使用方法
循环遍历逐行操作