Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Cursor dentro do cursor


Você tem uma variedade de problemas. Primeiro, por que você está usando seus valores @@FETCH_STATUS específicos? Deve ser apenas @@FETCH_STATUS =0.

Segundo, você não está selecionando seu cursor interno para nada. E não consigo pensar em nenhuma circunstância em que você selecionaria todos os campos dessa maneira - soletre-os!

Aqui está uma amostra para passar. A pasta tem uma chave primária de "ClientID" que também é uma chave estrangeira para atender. Estou apenas imprimindo todos os UIDs de atendimento, divididos por Folder ClientID:
Declare @ClientID int;
Declare @UID int;

DECLARE Cur1 CURSOR FOR
    SELECT ClientID From Folder;

OPEN Cur1
FETCH NEXT FROM Cur1 INTO @ClientID;
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Processing ClientID: ' + Cast(@ClientID as Varchar);
    DECLARE Cur2 CURSOR FOR
        SELECT UID FROM Attend Where [email protected];
    OPEN Cur2;
    FETCH NEXT FROM Cur2 INTO @UID;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT 'Found UID: ' + Cast(@UID as Varchar);
        FETCH NEXT FROM Cur2 INTO @UID;
    END;
    CLOSE Cur2;
    DEALLOCATE Cur2;
    FETCH NEXT FROM Cur1 INTO @ClientID;
END;
PRINT 'DONE';
CLOSE Cur1;
DEALLOCATE Cur1;

Finalmente, você tem CERTEZA você quer fazer algo assim em um procedimento armazenado? É muito fácil abusar dos procedimentos armazenados e muitas vezes reflete problemas na caracterização do seu problema. A amostra que dei, por exemplo, poderia ser realizada muito mais facilmente usando chamadas de seleção padrão.