如何根据某些条件在MSSQL游标中跳过一行(迭代)?

时间:2014-03-10 07:14:58

标签: sql sql-server tsql cursor

如何根据某些条件在MSSQL游标中跳过一行(迭代),我有一个DTS可以迁移数千条记录,并且基于某些条件,某些记录不需要迁移,因为它们是重复的并且想要跳过这些记录。

知道如何在MSSQL Cursor中实现这一点吗?

由于

Sirak

4 个答案:

答案 0 :(得分:2)

我在这里做了一些假设,但您可以使用以下内容作为指南:

    -- create some test data        
    SELECT '                                  ' [Word] INTO #MyTempDataset;
    INSERT INTO #MyTempDataset SELECT 'This';
    INSERT INTO #MyTempDataset SELECT 'is';
    INSERT INTO #MyTempDataset SELECT 'a';
    INSERT INTO #MyTempDataset SELECT 'basic';
    INSERT INTO #MyTempDataset SELECT 'basic';
    INSERT INTO #MyTempDataset SELECT 'test';

    DECLARE @counter INT
    DECLARE @word VARCHAR(50)
    DECLARE myCursor CURSOR
        FOR SELECT  *
            FROM    #MyTempDataset;
        OPEN myCursor
        FETCH NEXT FROM myCursor INTO @word
        WHILE @@FETCH_STATUS = 0
        BEGIN               
            -- check for condition
            SELECT  @counter = Count(*) 
            FROM    #MyTempDataset
            WHERE   word = @word

            IF @counter =1
            BEGIN
                -- process the unique records
                PRINT @word     
            END     

            FETCH NEXT FROM myCursor INTO @word
        END
        CLOSE myCursor;
        DEALLOCATE myCursor;

    DROP TABLE #MyTempDataset;

答案 1 :(得分:1)

我想最简单的方法是在游标中编写IF语句。如果条件为假,您将跳过记录。

 DECLARE @ID INT
 DECLARE Curs CURSOR FAST_FORWARD
 DECLARE @Cnt INT

 CREATE TABLE ##Duplicates (ID INT, CarColor VARCHAR (50) )

 FOR
        SELECT DISTINCT  CarID
        FROM    dbo.CarPark
        WHERE   CarColour <> 'red'
        ORDER BY CarID

    OPEN Curs

        FETCH NEXT FROM Curs INTO @ID

        WHILE @@FETCH_STATUS = 0

    BEGIN

             INSERT INTO  ##Duplicates
             SELECT CarID, CarColor
             FROM  dbo.CarPark          
             WHERE ID = @ID;

             SET @Cnt = (SELECT Count(*) FROM ##Duplicates WHERE ID = @ID) ;

             IF @Cnt < 2 
             THEN /* Migrate */
             ELSE PRINT 'Duplicate'
             END

        FETCH NEXT FROM Curs INTO @ID 

        END

    CLOSE Curs
    DEALLOCATE Curs;

答案 2 :(得分:1)

我知道回答这个问题为时已晚。但为了其他用户寻求更好的答案。您只需拨打FETCH NEXT即可跳过记录。

WHILE @@FETCH_STATUS = 0

IF @ParameterName = '@RETURN_VALUE' 
    FETCH NEXT FROM @procSchema INTO @ParameterName, @Type;

   .... Rest of the logic goes here

使用这种方法,您不必将整个逻辑包装在If语句中,而是转移到跳过当前记录的下一条记录。

答案 3 :(得分:0)

我知道现在回答这个问题为时已晚,但对于将来的求职者来说。我相信MSDN

中介绍了解决此问题的正确方法

您的代码正在使用WHILE循环(WHILE @@ FETCH_STATUS = 0)

要正确退出while循环,请使用BREAK关键字

要跳过循环,请使用CONTINUE关键字

从MSDN:

BREAK 从最里面的WHILE循环退出。在END关键字之后出现的所有语句(指示循环结束)都将被执行。

继续 导致WHILE循环重新启动,而忽略CONTINUE关键字之后的任何语句。

示例:     -在声明并打开游标之后...

FETCH NEXT FROM Curs INTO @ID    
WHILE @@FETCH_STATUS = 0    
BEGIN 
-- do something
IF [condition to skip record] 
CONTINUE            

FETCH NEXT FROM Curs INTO @ID 
  END