在SQL Server中使用游标变量的优点(声明@cn游标)

Kli*_*ger 7 t-sql sql-server syntax cursor

在T-SQL中,可以用两种方式声明游标(我知道):

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor

我正在运行一些测试,我注意到游标变量的创建不会在结果中添加条目sp_cursor_list.

从性能,资源利用率等角度来看,使用第二种方法是否有任何优势/劣势?

PS:我知道潜在的游标性能问题.我不是要求基于游标和基于集合的比较.或者游标while与temp/table变量.

小智 6

使用DECLARE @local_variable CURSOR我刚发现的语法还有另一个好处.

当一个存储过程调用另一个存储过程时,优势就会发生,并且两个过程同时打开游标.如果DECLARE cursor_name CURSOR用于定义游标,并且两个过程使用相同的cursor_name,则得到

消息16915:名称为"cursor_name"的游标已存在.

另一方面,If DECLARE @local_variable CURSOR用于定义父存储过程和子存储过程中的游标,则@local_variable每个过程都是本地的,并且没有冲突.对于之前没有使用过这种方法的人,这里有一个例子,@C用作局部变量:

DECLARE @C AS CURSOR;

SET @C = CURSOR FOR SELECT ...;

OPEN @C;

FETCH NEXT FROM @C INTO ...;
Run Code Online (Sandbox Code Playgroud)

...

  • 这并不是真正的优势,因为您可以将游标声明为本地游标,就像每个 SP 中的 DECLAREcursor_name CURSOR LOCAL 一样,然后就不会出现名称冲突。 (2认同)

HLG*_*GEM 4

据我了解,游标变量的目的是能够将其用作存储过程中的输出变量,从而使您能够将游标中的数据发送到另一个控制过程。我没有尝试过,所以我不知道它到底是如何工作的,但这就是我从阅读在线书籍中得到的。如果存在任何可测量的性能差异,并且肯定不是一开始不使用光标所能获得的改进,我会感到惊讶。如果您不打算将其用作输出变量,我建议保留更常见的游标定义可能会使代码更易于维护。

也就是说,实际上需要游标的情况非常非常少。