0

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

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

我的问题是:光标是否在每次迭代时执行该函数?视图的相同问题。
问候

4

1 回答 1

0

这取决于游标的类型:

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

查询有几个限制会影响游标的类型,如下所列:使用隐式游标转换

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

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

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

于 2012-12-22T06:01:34.793 回答