sql >> Database >  >> RDS >> Sqlserver

Cursor binnen cursor

Je hebt verschillende problemen. Ten eerste, waarom gebruikt u uw specifieke @@FETCH_STATUS-waarden? Het zou gewoon @@FETCH_STATUS =0 moeten zijn.

Ten tweede, je selecteert niet je innerlijke cursor in iets. En ik kan geen enkele omstandigheid bedenken waarin u alle velden op deze manier zou selecteren - spel ze uit!

Hier is een voorbeeld om langs te gaan. Map heeft een primaire sleutel van "ClientID" die ook een externe sleutel is voor Attend. Ik druk gewoon alle Attend UID's af, uitgesplitst naar map 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;

Eindelijk, ben je ZEKER wil je zoiets doen in een opgeslagen procedure? Het is heel gemakkelijk om opgeslagen procedures te misbruiken en weerspiegelt vaak problemen bij het karakteriseren van uw probleem. Het voorbeeld dat ik gaf, zou bijvoorbeeld veel gemakkelijker kunnen worden bereikt met behulp van standaard geselecteerde oproepen.



  1. mysqldump winkel null als leeg

  2. Kan de plv8 JavaScript-taalextensie bibliotheken van derden aanroepen?

  3. Sequelize.js verwijdert nog steeds de tabelrij, zelfs als paranoïde is ingesteld op true

  4. Een MySQL-database maken