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

时间:2010-11-22 18:12:44

标签: sql-server tsql syntax cursor

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

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor
  3. 我正在运行一些测试,我注意到创建游标变量不会在sp_cursor_list的结果中添加条目。

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

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

3 个答案:

答案 0 :(得分:6)

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

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

  

消息16915:名称为“cursor_name”的游标已存在。

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

DECLARE @C AS CURSOR;

SET @C = CURSOR FOR SELECT ...;

OPEN @C;

FETCH NEXT FROM @C INTO ...;

...

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

我会尽可能地避免使用光标(至少如果你考虑性能)。尝试为您的问题创建基于集合的解决方案。它们的处理速度通常比基于游标的解决方案快得多。