Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Cursor innerhalb des Cursors

Sie haben vielfältige Probleme. Erstens, warum verwenden Sie Ihre spezifischen @@FETCH_STATUS-Werte? Es sollte nur @@FETCH_STATUS =0 sein.

Zweitens wählen Sie Ihren inneren Cursor nicht in aus irgendetwas. Und ich kann mir keinen Umstand vorstellen, in dem Sie alle Felder auf diese Weise auswählen würden - buchstabieren Sie sie aus!

Hier ist eine Probe, an der Sie vorbeigehen können. Der Ordner hat einen Primärschlüssel von "ClientID", der auch ein Fremdschlüssel für Attend ist. Ich drucke nur alle Attend-UIDs, aufgeschlüsselt nach Ordner 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;

Schließlich sind Sie SICHER Sie möchten so etwas in einer gespeicherten Prozedur tun? Es ist sehr einfach, gespeicherte Prozeduren zu missbrauchen, und spiegelt häufig Probleme bei der Charakterisierung Ihres Problems wider. Das Beispiel, das ich gegeben habe, könnte zum Beispiel viel einfacher mit Standard-Select-Aufrufen durchgeführt werden.