整个函数或视图中的游标循环

时间:2012-11-22 14:29:31

标签: sql-server-2008 tsql cursor

我在表值函数中有一个游标循环,如下面的代码所示:

    DECLARE db_cursor CURSOR FOR 
            SELECT *        
            from    [dbo].[GetStock]()
                    ...

我的问题是:光标是否在每次迭代时都执行该函数?同一问题的观点。
此致

1 个答案:

答案 0 :(得分:0)

这取决于光标的类型:

  • 如果它是一个静态游标,那么它只会执行一次SELECT,将结果放在一个临时表中并从临时表中逐个获得结果
  • 如果它是动态光标,那么它将从查询中逐个获得结果
  • 如果它是一个键集驱动的游标,那么它将在光标打开时获取每个符合条件的行的密钥,并从原始查询逐个获取其余列
  • 如果它是快进光标,当结果具有唯一键时,它的行为类似于动态光标,或者当没有唯一键时,它就像静态光标一样。

有关查询的几个限制将影响光标的类型,如下所示:Using Implicit Cursor Conversions

您可以使用sp_describe_cursor过程找出游标类型。有关代码示例,请参阅sp_describe_cursor主题。

对于多语句UDF-s,您最有可能获得键集驱动的游标(如果结果表具有唯一键)或静态游标(如果结果表没有唯一键)。对于内联UDF,它取决于查询和基础表。

我猜你有一个多语句UDF,在这种情况下,你应该通过在声明游标时指定STATIC来避免使用键盘驱动的游标。