Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cursore all'interno del cursore

Hai una serie di problemi. Innanzitutto, perché stai utilizzando i tuoi valori @@FETCH_STATUS specifici? Dovrebbe essere solo @@FETCH_STATUS =0.

Secondo, non stai selezionando il cursore interno in qualsiasi cosa. E non riesco a pensare a nessuna circostanza in cui potresti selezionare tutti i campi in questo modo:scrivili!

Ecco un esempio da seguire. La cartella ha una chiave primaria di "ClientID" che è anche una chiave esterna per Attendere. Sto solo stampando tutti gli UID di partecipazione, suddivisi per 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;

Infine, sei SICURO vuoi fare qualcosa del genere in una procedura memorizzata? È molto facile abusare delle stored procedure e spesso riflette problemi nel caratterizzare il tuo problema. L'esempio che ho fornito, ad esempio, potrebbe essere realizzato molto più facilmente utilizzando chiamate di selezione standard.