SQL Server中游标的用途是什么?

Red*_*wan 27 sql-server database-cursor

我想使用数据库游标; 首先,我需要了解它的用途和语法是什么,以及在哪种情况下我们可以在存储过程中使用它?不同版本的SQL Server是否有不同的语法?

什么时候需要使用?

Jef*_*tin 38

游标是一种通过结果集的行显式枚举的机制,而不是像这样检索它.

然而,尽管对于习惯于编写的程序员来说它们可能更适合使用While Not RS.EOF Do ...,但是如果可能的话,它们通常是SQL Server存储过程中要避免的 - 如果你可以在不使用游标的情况下编写查询,那么你可以优化器有更好的机会找到快速实现它的方法.

老实说,我从来没有找到一个无法避免的游标的实际用例,除了一些管理任务,例如循环遍历目录中的所有索引并重建它们.我认为它们可能在报告生成或邮件合并中有一些用途,但是在与数据库对话的应用程序中执行类似游标的工作可能更有效,让数据库引擎执行它最擅长的操作 - 设置操作.

  • 我发现游标的唯一真正需求是与触发器相关时 - 如果您有多个记录受影响,并且您想要为每个记录执行存储过程,则需要光标触发表(例如"INSERTED") (4认同)
  • +1大部分时间都不是必需的.仅在一次性作业中使用它们或在所有其他选项失败时使用它们. (2认同)

小智 16

使用游标是因为在子查询中我们可以逐行获取记录,因此我们使用游标来获取记录

游标示例:

DECLARE @eName varchar(50), @job varchar(50)

DECLARE MynewCursor CURSOR -- Declare cursor name

FOR
Select eName, job FROM emp where deptno =10

OPEN MynewCursor -- open the cursor

FETCH NEXT FROM MynewCursor
INTO @eName, @job

PRINT @eName + ' ' + @job -- print the name

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM MynewCursor 
INTO @ename, @job

PRINT @eName +' ' + @job -- print the name

END

CLOSE MynewCursor

DEALLOCATE MynewCursor
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

ROHIT                           PRG  
jayesh                          PRG
Rocky                           prg
Rocky                           prg
Run Code Online (Sandbox Code Playgroud)

  • 我们可以从简单的查询'Select eName,job FROM emp where deptno = 10'获得相同的结果,那么为什么要使用游标来循环它,任何实际用途? (2认同)

小智 8

游标可能用于逐行检索数据.它的作用类似于循环语句(即while或for循环).要在SQL过程中使用游标,您需要执行以下操作:1.Declare定义结果集的游标.2.打开光标以建立结果集.3.根据需要从光标获取数据到局部变量,一次一行.4.完成后关闭光标.

对于前:

declare @tab table
(
Game varchar(15),
Rollno varchar(15)
)
insert into @tab values('Cricket','R11')
insert into @tab values('VollyBall','R12')

declare @game  varchar(20)
declare @Rollno varchar(20)

declare cur2 cursor for select game,rollno from @tab 

open cur2

fetch next from cur2 into @game,@rollno

WHILE   @@FETCH_STATUS = 0   
begin

print @game

print @rollno

FETCH NEXT FROM cur2 into @game,@rollno

end

close cur2

deallocate cur2
Run Code Online (Sandbox Code Playgroud)