SQLSERVER游标
一、什么游标
1、 游标的本质是将查询的结果存起来,然后可以一条一条的操作这些数据(不需使用sql中的循环和where条件,而是使用游标中自带的函数就可以一条一条的操作),select查询出的结果如果要一条一条的操作这些数据,就必须要使用while循环和where 条件,而且要有一个不重复的字段最后这个字段还是int类型的这个才可以一条一条的循环操作,而游标就不必这样处理;
2.、如果要多次处理这些存起来的数据,select就得用一次写一次这个个查询语句,而游标配合while就直接使用就可以了不必再次写查询语句 (每一个游标都会有一个名字,使用的时候直接使用open 游标名进行操作), 所以游标和select查询是有区别的。
3、 使用游标和select 对比优缺点
游标 | select | 对比 |
---|---|---|
√ | 多次使用,不用重复写查询语句。 | |
√ | 能够不用使用 where 和while 就一条一条的操作数据。 | |
√ | 放入内存中,当数据量较大是占用内存做。 | |
√ | 批量操作查询数据。 |
二、游标分类
1、静态游标: __在获取完来源表数据后,游标中的数据是固定的不会改变,就算来源表中的数据发生了改变,游标中的数据也保持原来的数据不变,除非重新获取数据。
2、动态游标: __获取完数据后,当来源表的数据发生变化,游标中的数据也随之发生改变。
SQLserver中创建游标默认是动态游标,只有设置了STATIC才是静态游标
三、游标语法
(一、)创建游标
1、声明游标变量以及游标
2、获取数据
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] ] ]
(二、)使用游标
1、打开游标
OPEN [ GLOBAL ] cursor_name | cursor_variable_name;
2、游标中读取数据插入到游标变量中
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [GLOBAL ] cursor_name } | @cursor_variable_name}
[ INTO @variable_name [ ,...n ] ]
3、WHILE循环游标,逻辑加工
WHILE @@FETCH_STATUS=0 --判断FETCH语句是否执行成功(即游标中还有数据)
(三、)关闭游标、释放游标
1、关闭游标
CLOSE cursor_name ;
2、释放游标资源
DEALLOCATE cursor_name ;
四、示例
这里一常用的动态游标为例
declare @id int ,@name varchar(15)--1、声明游标变量主要作用是将存入游标中的数据赋值到变量中好进行处理。
declare mycursor cursor --2、声明游标
for select id,name from students --3、将表数据存入到游标mycursor中
open mycursor --4、打开游标mycursor
fetch next from mycursor into @id,@name--5、读取游标中的数据插入到游标变量中
while (@@fetch_status=0) --6、循环读取游标中的数据
begin
print (convert (varchar,@id)+'--'+@name)--7、打印出读取的每一条数据
fetch next from mycursor into @id,@name --8、读取下一条游标中的数据
end
close mycursor --9、关闭游标
deallocate mycursor --10、释放游标