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

Markøren inde i markøren

Du har en række forskellige problemer. For det første, hvorfor bruger du dine specifikke @@FETCH_STATUS-værdier? Det skal bare være @@FETCH_STATUS =0.

For det andet vælger du ikke din indre markør ind i hvad som helst. Og jeg kan ikke komme i tanke om nogen omstændigheder, hvor du ville vælge alle felter på denne måde - stave dem ud!

Her er et eksempel at gå efter. Mappe har en primær nøgle "ClientID", som også er en fremmednøgle til Attend. Jeg udskriver lige alle Attend UID'er, opdelt efter mappeklient-id:

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;

Endelig, er du SIKKER vil du gøre noget som dette i en lagret procedure? Det er meget nemt at misbruge lagrede procedurer og afspejler ofte problemer med at karakterisere dit problem. Eksemplet, jeg gav, for eksempel, kunne langt nemmere udføres ved at bruge standardvalgte opkald.



  1. Opdele et stort antal rækker i mindre forespørgsler? Parallelisme

  2. Binding af forespørgselsparametre efter navn med ODP.NET

  3. Er PostgreSQL-funktioner transaktionelle?

  4. Opdater flere poster i én ActiveRecord-transaktion i Rails