什么是Sql Server游标

什么是Sql Sever游标

游标的概述
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。
由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
游标实际上是一种能从包括多条数据记录的结果集中每次提取-条记录的机制

游标的作用

1.允许定位到结果集中的特定行。

2.从结果集的当前位置检索一行或多行数据。

3.支持对结果集中当前位置的行进行修改

当需要逐条读取记录时可以用游标,相当于for循环容,一次获取一条记录进行操作。当一组记录没有id字段时,此时用for循环不能够实现,而游标可以解决此问题
注:当数据量很大的时候不建议使用游标,因为游标处理处理数据比较慢

游标的优缺点
优点:

1.允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。

2.提供对基于游标位置的表中的行进行删除和更新的能力。

3.游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

缺点:

处理大数据量时,效率低下,占用内存大;
一般来说,能使用其他方式处理数据时,最好不要使用游标,除非是当你使用while循环,子查询,临时表,表变量,自建函数或其他方式都无法处理某种操作的时候,再考虑使用游标。

游标的创建

创建游标:

DECLARE cursor_ name [ INSENSITIVE][ SCROLL ] CURSOR FOR select_ statement [ F0R { READ
ONLY
UPDATE [ OF column_ name [ …n ] ] } ]

cursor_ name
是所定义的Transact-SQL 游标名称。

游标的编写

举例:
现有以下表
Customers在这里插入图片描述
–修改消费等级这个字段
–当消费金额》1000,等级大客户
–500-1000包含500,不包括1000 等级中等客户
–小于500 小客户
–怎么去实现

Create proc cp_update_Level
as
--声明游标
declare cur_customer Cursor 
for select * from  Customers
--打开游标
open cur_customer
--通过游标获取数据,ID,ComsumeAmount 取值
declare @id int
declare @Cacount int
fetch next from cur_cust_level into @id,@Cacount
--循环往下
while(@@FETCH_STATUS=0)
begin
--print @id+@Caount
--修改消费等级
if(@Cacount<500)
update Customers set ConsumeLevel='低消费' where id=@id
else if (@Cacount<1000)
update Customers set ConsumeLevel='中消费' where id=@id
else 
update Customers set ConsumeLevel='高消费' where id=@id
fetch next from cur_cust_level into @id,@Cacount
end
--关闭游标
close cur_cust_level
--释放游标
deallocate cur_cust_level
--查询
select * from Customers

再举例:
现有以下空表
statis
在这里插入图片描述
–将其做为统计报表
–日报表日营业额
–统计每天的消费金额
–根据年月日进行分组,汇总
–存到一个表里面 一年存365
–月报表
–年报表
–将该查询结果,一条条插入到统计表中间

--将该查询结果,一条条插入到统计表中间
--声明游标
declare cur_statis Cursor
for
select year(ConsumeTIme) yy,MONTH(ConsumeTime) mm,DAY(ConsumeTime) dd,sum(counsumeAmount) yye from Customers
group by year(ConsumeTIme),MONTH(ConsumeTime),DAY(ConsumeTime)
--打开游标
open cur_statis
--游览数据并获取
declare @yy varchar(50)
declare @mm varchar(50)
declare @dd varchar(50)
declare @yye int
fetch next from cur_statis into @yy,@mm,@dd,@yye
while(@@FETCH_STATUS=0)
begin
insert into statis values(@yy,@mm,@dd,@yye)
fetch next from cur_statis into @yy,@mm,@dd,@yye
end
--关闭游标
close cur_statis
deallocate cur_statis
--查询

select * from statis

猜你喜欢

转载自blog.csdn.net/weixin_47945234/article/details/106353544