sql >> Databáze >  >> RDS >> Sqlserver

Kurzor uvnitř kurzoru

Máte různé problémy. Za prvé, proč používáte své konkrétní hodnoty @@FETCH_STATUS? Mělo by být pouze @@FETCH_STATUS =0.

Za druhé, nevybíráte svůj vnitřní kurzor do cokoliv. A nenapadá mě žádná okolnost, kdy byste tímto způsobem vybrali všechna pole – napište je!

Zde je ukázka. Složka má primární klíč "ClientID", což je také cizí klíč pro Attend. Právě tisknu všechna Attend UID, rozdělená podle 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;

Konečně, JISTÝ? chcete něco takového dělat v uložené proceduře? Je velmi snadné zneužít uložené procedury a často odráží problémy při charakterizaci vašeho problému. Příklad, který jsem uvedl, by například mohl být mnohem snadněji proveden pomocí standardních výběrových volání.



  1. Specifický formát data v mysql

  2. Správa uživatelských účtů, role, oprávnění, autentizace PHP a MySQL - 2. část

  3. SQL JOIN dvě tabulky s AVG

  4. SQLiteReadOnlyDatabaseException:pokus o zápis databáze pouze pro čtení (kód 1032)