代码之家  ›  专栏  ›  技术社区  ›  Klinger

在SQL Server中使用cursor变量的优点(declare@cn cursor)

  •  7
  • Klinger  · 技术社区  · 14 年前

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

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

    我正在运行一些测试,我注意到创建光标变量不会向 sp_cursor_list .

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

    PS: 我知道潜在的光标性能问题。我不要求比较光标和基于集合的光标。或光标vs while 带温度/表变量。

    3 回复  |  直到 12 年前
        1
  •  4
  •   HLGEM    14 年前

    据我所读,cursor变量的用途是能够在存储过程中将其用作输出变量,从而使您能够将光标中的数据发送到另一个控制过程。我还没有尝试过,所以我不知道它究竟是如何工作的,但这是我从网上阅读书籍中得到的。如果有任何可测量的性能差异,当然没有一开始就不使用光标所能得到的改进,我会感到惊讶。如果您不打算将它用作输出变量,我建议您使用更常见的光标定义,这样可以使代码更容易维护。

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

        2
  •  6
  •   Linus Caldwell Emperor 2052    12 年前

    使用 DECLARE @local_variable CURSOR 我刚刚发现的语法。

    当一个存储过程调用另一个存储过程,并且两个过程都同时打开了游标时,这一优势就出现了。如果 DECLARE cursor_name CURSOR 用于定义光标,两个过程使用相同的光标名称,然后

    msg 16915:名为“cursor_name”的光标已存在。

    另一方面,如果 声明@local_variable cursor 用于定义父存储过程和子存储过程中的游标,然后 @local_variable 每个程序都是本地的,没有冲突。对于以前没有使用过此方法的用户,下面是一个示例,使用 @C 作为局部变量:

    DECLARE @C AS CURSOR;
    
    SET @C = CURSOR FOR SELECT ...;
    
    OPEN @C;
    
    FETCH NEXT FROM @C INTO ...;
    

        3
  •  0
  •   Heiko Hatzfeld    14 年前

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