2010-11-22 63 views
7

在T-SQL游标可通过两种方式进行声明(即我所知道的):优势(声明@cn光标)

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

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

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

PS:我知道潜在的游标性能问题。我不是要求比较游标和基于集合的比较。或光标与while与临时/表变量。

+3

如果性能是一个考虑因素,你可能不应该使用游标:) – JNK 2010-11-22 18:14:37

+0

如果您发布代码或XML,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010),以良好地格式化和语法突出显示它! – 2010-11-22 18:21:33

回答

4

从我读的游标变量的目的是为了能够使用它作为存储过程中的输出变量,从而使您能够将光标中的数据发送到另一个控制过程。我没有试过这个,所以我不知道它会如何工作,但这是我从阅读联机丛书中得到的。如果有任何可衡量的性能差异,并且肯定不是首先不使用光标所能获得的改进,我会感到惊讶。如果你不打算将它用作输出变量,我建议继续使用更常见的游标定义可能会使代码更容易维护。

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

0

我会尽量避免诅咒者(至少如果你考虑性能的话)。尝试为您的问题创建一套基于解决方案。他们通常会比基于光标的解决方案处理速度快得多。

4

使用我刚发现的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 ...; 

...