sql >> Base de Datos >  >> RDS >> Sqlserver

Cursor dentro del cursor

Tienes una variedad de problemas. Primero, ¿por qué está utilizando sus valores específicos de @@FETCH_STATUS? Debería ser @@FETCH_STATUS =0.

En segundo lugar, no está seleccionando su cursor interno en cualquier cosa. Y no puedo pensar en ninguna circunstancia en la que seleccionaría todos los campos de esta manera, ¡explíquelos!

Aquí hay una muestra para pasar. La carpeta tiene una clave principal de "ClientID" que también es una clave externa para Attend. Solo estoy imprimiendo todos los UID de asistencia, desglosados ​​por ID de cliente de carpeta:

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;

Finalmente, ¿estás SEGURO ¿Quieres estar haciendo algo como esto en un procedimiento almacenado? Es muy fácil abusar de los procedimientos almacenados y, a menudo, refleja problemas al caracterizar su problema. La muestra que di, por ejemplo, podría lograrse mucho más fácilmente usando llamadas de selección estándar.