【问题标题】:Continue from top in SQL SERVER Cursor?在 SQL SERVER 游标中从顶部继续?
【发布时间】:2013-07-24 21:13:43
【问题描述】:

在 C# 语言中,我们在循环中使用 continue 语句来移动到下一次迭代。但是在 TSQL 中使用 Cursor 时,我该如何执行相同的操作。假设我有,

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256);
DECLARE @myAge INT;
DECLARE @myFavoriteColor VARCHAR(40);
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
WHILE @@FETCH_STATUS = 0  
BEGIN  
       --Do stuff 
       IF @myAge=1
       BEGIN
          -- Use continue here
       END    
       --Do stuff 


       FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

【问题讨论】:

  • 当然你知道如果有基于集合的方法来完成任务,那么使用游标是不好的做法,对吧?光标是性能杀手。

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

试试这个 -

DECLARE 
       @myName VARCHAR(256)
     , @myAge INT
     , @myFavoriteColor VARCHAR(40)

DECLARE cursor_name CURSOR FAST_FORWARD READ_ONLY FOR
     SELECT age, name, color 
     FROM [table]

OPEN db_cursor

FETCH NEXT FROM db_cursor INTO 
       @myName
     , @myAge
     , @myFavoriteColor

WHILE @@FETCH_STATUS = 0 BEGIN

       IF @myAge = 1 BEGIN

            FETCH NEXT FROM db_cursor INTO 
                   @myName
                 , @myAge
                 , @myFavoriteColor

       END    

       FETCH NEXT FROM db_cursor INTO 
            @myName
          , @myAge
          , @myFavoriteColor

END

CLOSE db_cursor
DEALLOCATE db_cursor

【讨论】:

  • 我认为 CONTINUE 不像 C# 那样进入下一次迭代
  • @user960567 - 这是Technet page
  • @Damien_The_Unbeliever,我已经结合了 FETCH NEXT 和 Continue 来使其工作。谢谢。
【解决方案2】:

CONTINUE 确实回到了 WHILE 循环的开头,但它与 C# 中的不完全一样,因为 T-SQL 中的游标循环习惯用法被分成两个单独的语句,而 WHILE 是第二个——最干净,需要最少重复的,可能是我们的老朋友GOTO

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256);
DECLARE @myAge INT;
DECLARE @myFavoriteColor VARCHAR(40);
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
WHILE @@FETCH_STATUS = 0  
BEGIN  
       --Do stuff 
       IF @myAge=1
       BEGIN
          Goto Cont
       END    
       --Do stuff 

Cont:
       FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

【讨论】:

  • 哦,这个也很好看。谢谢。
【解决方案3】:

您可以以这种方式使用 CONTINUE

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256);
DECLARE @myAge INT;
DECLARE @myFavoriteColor VARCHAR(40);
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
WHILE @@FETCH_STATUS = 0  
BEGIN  
       --Do stuff 
       IF @myAge=1
       BEGIN

           FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
           CONTINUE;
       END    
       --Do stuff 


       FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多