标签:管理 read_only cal 顺序 strong scroll 取数据 -- close
游标是属于级行操作,遍历一个表一行一行读,而SQL查询是基于数据集的,在数据量大的时候,使用游标会降低查询速度。这是很明显的。但是有些操作就用游标实现。所以游标又是不或缺少的。我很久都没用游标了,一时我也不记得怎么写,只记得游标操作一般三步。
1.定义一个游标,将查询的数据放到在这游标中
2.打开游标
3.在WHILE里遍历游标,当状态不是0的时候表明没有记录了。
在网上找了个很好的例子,记在这里,以便下次查阅
--申明一个游标 DECLARE MyCursor CURSOR FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo --打开一个游标 OPEN MyCursor --循环一个游标 DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(2000) FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding WHILE @@FETCH_STATUS =0 BEGIN print ‘name‘+@BookName FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding END --关闭游标 CLOSE MyCursor --释放资源 DEALLOCATE MyCursor
我还实战了一把,将表里某些指定的数据更新,需要用到SQL语句的判断表是否存这句:
if exists (select * from sys_boardRight where Account=@Account)
print ‘yes‘;
else
print ‘no‘;
--申明一个游标 DECLARE MyCursor CURSOR FOR SELECT Account from rtx where department like ‘%集团\春天\%‘ --打开一个游标 OPEN MyCursor --循环一个游标 DECLARE @Account nvarchar(50) -- FETCH NEXT FROM MyCursor INTO @Account WHILE @@FETCH_STATUS =0 BEGIN if exists (select * from sys_boardRight where Account=@Account) print ‘no‘ else Insert into sys_boardRight(Account,Rights) values(@Account,2) FETCH NEXT FROM MyCursor INTO @Account END --关闭游标 CLOSE MyCursor --释放资源 DEALLOCATE MyCursor
结果集,结果集就是select查询之后返回的所有行数据的集合。
游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。
一般复杂的存储过程,都会有游标的出现,他的用处主要有:
根据游标检测结果集变化的能力和消耗资源的情况不同,SQL Server支持的API服务器游标分为一下4种:
静态游标在滚动时检测不到表数据变化,但消耗的资源相对很少。动态游标在滚动时能检测到所有表数据变化,但消耗的资源却较多。键集驱动游标则处于他们中间,所以根据需求建立适合自己的游标,避免资源浪费。。
游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
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 UPDATE [ OF column_name [ ,...n ] ] ]
参数说明:
2.声明一个动态游标
declare orderNum_02_cursor cursor scroll for select OrderId from bigorder where orderNum=‘ZEORD003402‘
3.打开游标
--打开游标语法 open [ Global ] cursor_name | cursor_variable_name
cursor_name:游标名,cursor_variable_name:游标变量名称,该变量引用了一个游标。
--打开游标 open orderNum_02_cursor
4.提取数据
--提取游标语法 Fetch [ [Next|prior|Frist|Last|Absoute n|Relative n ] from ] [Global] cursor_name [into @variable_name[,....]]
参数说明:
例子:
--提取数据 fetch first from orderNum_02_cursor fetch relative 3 from orderNum_02_cursor fetch next from orderNum_02_cursor fetch absolute 4 from orderNum_02_cursor fetch next from orderNum_02_cursor fetch last from orderNum_02_cursor fetch prior from orderNum_02_cursor select * from bigorder where orderNum=‘ZEORD003402‘
结果(对比一下,就明白啦):
例子:
--提取数据赋值给变量 declare @OrderId int fetch absolute 3 from orderNum_02_cursor into @OrderId select @OrderId as id select * from bigorder where orderNum=‘ZEORD003402‘
结果:
通过检测全局变量@@Fetch_Status的值,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。当执行一条Fetch语句之后,@@Fetch_Status可能出现3种值:0,Fetch语句成功。-1:Fetch语句失败或行不在结果集中。-2:提取的行不存在。
这个状态值可以帮你判断提取数据的成功与否。
declare @OrderId int fetch absolute 3 from orderNum_02_cursor into @OrderId while @@fetch_status=0 --提取成功,进行下一条数据的提取操作 begin select @OrderId as id fetch next from orderNum_02_cursor into @OrderId --移动游标 end
5.利用游标更新删除数据
--游标修改当前数据语法 Update 基表名 Set 列名=值[,...] Where Current of 游标名 --游标删除当前数据语法 Delete 基表名 Where Current of 游标名
---游标更新删除当前数据 ---1.声明游标 declare orderNum_03_cursor cursor scroll for select OrderId ,userId from bigorder where orderNum=‘ZEORD003402‘ --2.打开游标 open orderNum_03_cursor --3.声明游标提取数据所要存放的变量 declare @OrderId int ,@userId varchar(15) --4.定位游标到哪一行 fetch First from orderNum_03_cursor into @OrderId,@userId --into的变量数量必须与游标查询结果集的列数相同 while @@fetch_status=0 --提取成功,进行下一条数据的提取操作 begin if @OrderId=122182 begin Update bigorder Set UserId=‘123‘ Where Current of orderNum_03_cursor --修改当前行 end if @OrderId=154074 begin Delete bigorder Where Current of orderNum_03_cursor --删除当前行 end fetch next from orderNum_03_cursor into @OrderId ,@userId --移动游标 end
6.关闭游标
游标打开后,服务器会专门为游标分配一定的内存空间存放游标操作的数据结果集,同时使用游标也会对某些数据进行封锁。所以游标一旦用过,应及时关闭,避免服务器资源浪费。
--关闭游标语法 close [ Global ] cursor_name | cursor_variable_name --关闭游标 close orderNum_03_cursor
7.删除游标
删除游标,释放资源
--释放游标语法 deallocate [ Global ] cursor_name | cursor_variable_name --释放游标 deallocate orderNum_03_cursor
整合自:https://www.cnblogs.com/knowledgesea/p/3699851.html
标签:管理 read_only cal 顺序 strong scroll 取数据 -- close
原文地址:https://www.cnblogs.com/zhoufangcheng04050227/p/13266805.html