fetch 和 fetch next 有什么区别?

Jam*_*mes 4 sql-server

我有一个游标发送寻呼机消息,偶尔它会发送重复的消息。语法如下所示:

    declare @col1 varchar(255),
    @col2 varchar(255)

    declare c cursor local for

    select column1, column2
    from table
    where flippity = 'floppity'

    open c
    fetch  from c into @col1, @col2
    While @@FETCH_STATUS = 0
    begin

    sp_do_your_thing @col1, @col2

    fetch next from c into @col1, @col2
    end
    close c
    deallocate c
Run Code Online (Sandbox Code Playgroud)

问题:如果我得到重复,可能是提取吗?他们都需要下一个,还是都不需要?

Aar*_*and 11

没有区别,省略NEXT不会以任何方式导致重复或不同的结果。NEXT只是默认行为的显式声明。从语法图

FETCH   
      [ [ NEXT | PRIOR | FIRST | LAST   
                | ABSOLUTE { n | @nvar }   
                | RELATIVE { n | @nvar }   
           ]   
           FROM   
Run Code Online (Sandbox Code Playgroud)

NEXT不是唯一的选项,大多数其他选项仅适用于某些类型的游标。我很难养成这个习惯,因为我只使用快进、单程、“firehose”游标,但最佳实践是包括NEXT明确。

我会查看查询,因为我怀疑在不涉及游标时它也会返回重复项。或者,无论存储过程在做什么,都让它看起来像是重复的。另一种可能的解释是,如果查询正在使用WITH (NOLOCK)/READUNCOMMITTED并且由于数据移动而您在分配顺序扫描中两次读取同一行。