SqlServer中游标的使用

本文通过SQL语句展示了如何使用游标从数据库中提取数据,并进行更新操作,包括提取、显示、循环处理数据及游标更新数据等基本流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
select * from stuInfo

--声明游标
declare stuinfoCur cursor scroll for select * from stuinfo
declare @stuname varchar(20),@stuno varchar(20),@stuage int,@stuid varchar(20),@stuseat int,@stuaddress varchar(50)
--打开游标
open stuinfoCur
--提取数据
fetch next from stuinfoCur into @stuname,@stuno,@stuage,@stuid,@stuseat,@stuaddress
while @@FETCH_STATUS=0
begin
	print '--------------------'
	print @stuname
	print @stuno
	print @stuage
	print @stuid
	print @stuseat
	print @stuaddress
	print '--------------------'
	fetch next from stuinfoCur into @stuname,@stuno,@stuage,@stuid,@stuseat,@stuaddress
end
--关闭游标
close stuinfoCur
go
-- 释放游标
deallocate stuinfoCur

if exists(select * from sys.objects where name='PROC_UP_MARKS' and type='P')
drop proc PROC_UP_MARKS
go
create proc PROC_UP_MARKS
as
begin
	declare stucur cursor for select stuno,stuage from stuinfo
	declare @no varchar(20),@age int
	open stucur
	fetch next from stucur into @no,@age
	while @@FETCH_STATUS=0
	begin
		if @age>=20
		begin
			if (select writtenExam from stuMarks where stuNo=@no)<80
			begin
				update stuMarks set writtenExam=writtenExam+5 where stuNo=@no
			end
			if (select labExam from stuMarks where stuNo=@no)<80
			begin
				update stuMarks set LabExam=LabExam+5 where stuNo=@no
			end
		end
		else
		begin
			if (select writtenExam from stuMarks where stuNo=@no)<80
			begin
				update stuMarks set writtenExam=writtenExam+10 where stuNo=@no
			end
			if (select labExam from stuMarks where stuNo=@no)<80
			begin
				update stuMarks set LabExam=LabExam+10 where stuNo=@no
			end
		end
		fetch next from stucur into @no,@age
	end
	close stucur
	deallocate stucur
end

exec proc_up_marks

select * from stuInfo

--利用游标更新数据
declare stucur cursor scroll for select * from stuinfo for update of stuage
open stucur
fetch first from stucur
while @@FETCH_STATUS=0
begin
	update stuInfo set stuAge=stuAge+1 where current of stucur
	fetch next from stucur
end
close stucur
deallocate stucur

--游标变量
declare @cur cursor
declare stucur cursor for select * from stuinfo
set @cur=stucur
open @cur
fetch next from @cur
while @@FETCH_STATUS=0
begin
	fetch next from @cur
end
close @cur
deallocate @cur
print '*********************************'
open stucur
fetch next from stucur
while @@FETCH_STATUS=0
begin
	fetch next from stucur
end
close stucur
deallocate stucur
go



### SQL Server游标的作用和用途 #### 游标的概念 游标Cursor)是一种用于遍历结果集的机制,允许逐行处理查询返回的结果集。它并不是简单的 `SELECT` 语句,而是一个存储在数据库管理系统 (DBMS) 上的对象,能够提供对结果集中每一行数据的操作能力[^2]。 #### 静态游标与动态游标的区别 静态游标 (`STATIC`) 是一种缓存型游标,在其创建时会将整个结果集复制到临时表中。因此,当通过静态游标访问数据时,不会反映其他事务对该数据所做的更改[^1]。 相比之下,动态游标 (`DYNAMIC`) 不会在内存中保存完整的副本,而是实时读取基础表中的数据变化。这意味着如果底层数据发生变化,则这些变更会被立即体现在游标中[^1]。 #### 创建和使用游标的语法结构 以下是标准的游标操作流程: 1. **声明游标**: 定义游标及其对应的查询逻辑。 ```sql DECLARE my_cursor CURSOR FOR SELECT name, id FROM table; ``` 2. **打开游标**: 将游标初始化以便后续迭代。 ```sql OPEN my_cursor; ``` 3. **声明变量并提取数据**: 准备接收每条记录值的局部变量,并从中取出当前行的内容。 ```sql FETCH NEXT FROM my_cursor INTO @name, @id; WHILE (@@FETCH_STATUS = 0) BEGIN PRINT(@name); FETCH NEXT FROM my_cursor INTO @name, @id; END; ``` 4. **关闭及销毁游标**: 当完成所有必要的处理后,记得清理资源以避免潜在性能问题。 ```sql CLOSE my_cursor; DEALLOCATE my_cursor; ``` #### 常见的应用场景 - **复杂业务逻辑下的单行更新**:某些情况下可能需要基于特定条件逐一修改大量独立记录;此时利用游标可实现精确控制而不必担心批量 DML 的副作用[^3]。 - **分页显示大数据量表格**:尽管现代方法更倾向于采用窗口函数等方式解决此类需求,但在早期版本或者特殊环境中仍需依赖于显式的游标技术来逐步加载页面所需部分信息。 - **异步任务调度管理**:例如定时器触发的任务队列监控程序可能会运用游标依次检查待办事项列表状态进而决定下一步动作序列。 #### 性能考量 需要注意的是,虽然游标提供了极大的灵活性,但由于它们本质上属于过程化编程风格而非集合运算方式,所以在大规模数据处理方面往往效率较低。对于大多数常规应用而言,推荐优先考虑 SET-based 方法替代 Cursor-based 解决方案除非确实存在无法规避的技术障碍才转而求助于此工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值