Abrufen mehrerer Werte im SQL Server-Cursor

75

Ich habe einen Cursor, der mehrere Spalten aus der zurückgebrachten Zeile enthält, die ich sofort verarbeiten möchte. Ich stelle fest, dass die meisten Beispiele, die ich zur Verwendung von Cursorn gesehen habe, zeigen, dass sie nacheinander einem Skalarwert eine bestimmte Spalte vom Cursor zuweisen und dann zur nächsten Zeile übergehen.

z.B

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @name  

WHILE @@FETCH_STATUS = 0  
BEGIN  
       --Do Stuff with @name scalar value, then get next row from cursor

       FETCH NEXT FROM db_cursor INTO @name  
END

Ich möchte wissen, ob es möglich ist, Folgendes zu tun:

    OPEN db_cursor  
    FETCH NEXT FROM db_cursor; 

    WHILE @@FETCH_STATUS = 0  
    BEGIN  
           SET @myName = db_cursor.name;
           SET @myAge = db_cursor.age;
           SET @myFavoriteColor = db_cursor.favoriteColor;
           --Do stuff with scalar values

           FETCH NEXT FROM db_cursor; 
    END

Hilfe wird immer geschätzt.

kingrichard2005
quelle

Antworten:

157

Das sollte funktionieren:

DECLARE db_cursor CURSOR FOR SELECT name, age, 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 with scalar values

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

Verwenden Sie nicht @@ fetch_status - dies gibt den Status des letzten Cursors in der aktuellen Verbindung zurück. Verwenden Sie das folgende Beispiel:

declare @sqCur cursor;
declare @data varchar(1000);
declare @i int = 0, @lastNum int, @rowNum int;
set @sqCur = cursor local static read_only for 
    select
         row_number() over (order by(select null)) as RowNum
        ,Data -- you fields
    from YourIntTable
open @cur
begin try
    fetch last from @cur into @lastNum, @data
    fetch absolute 1 from @cur into @rowNum, @data --start from the beginning and get first value 
    while @i < @lastNum
    begin
        set @i += 1

        --Do your job here
        print @data

        fetch next from @cur into @rowNum, @data
    end
end try
begin catch
    close @cur      --|
    deallocate @cur --|-remove this 3 lines if you do not throw
    ;throw          --|
end catch
close @cur
deallocate @cur
BazSTR
quelle