parent nodes: SQLapuntes

Cursores SQL

Declarar

Declarar la variable cursor (sin arroba) para una consulta y tantas variables como columnas de la consulta SELECT
DECLARE CURSOR_NOTARIOS CURSOR FOR
	SELECT ID_NOTARIO, ID_NOTARIAS_ACTUAL 
	FROM NOTARIOS 
	WHERE PERTENECE = 1 AND ID_NOTARIAS_ACTUAL >1 AND ID_NOTARIAS_ACTUAL < 10
	ORDER BY ID_NOTARIO 

DECLARE @ID_NOTARIO INT
DECLARE @ID_NOTARIA INT 

Abrir y almacenar

Abrir el cursor y almacenar el primer registro del resultado en variables
OPEN CURSOR_NOTARIOS 
    FETCH NEXT FROM CURSOR_NOTARIOS 
    INTO @ID_NOTARIO, @ID_NOTARIA 
Si ha habido error las variables estarán vacías

Bucle

En caso de no poder pasar al siguiente registro (o al primero) se pondrá a cero la variable @@FETCH_STATUS, esto sirve de condición de salida para el bucle del cursor
Al final de cada iteración hay que volver a hacer Fetch del cursor en las variables para pasar al siguiente registro del resultado de la consulta
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        -- (···)
        
        FETCH NEXT FROM CURSOR_NOTARIOS 
        INTO @ID_NOTARIO, @ID_NOTARIA 
    END

Cerrar y liberar

Al final hay que cerrar el cursor y liberar la memoria que ha usado.
CLOSE CURSOR_NOTARIOS 
DEALLOCATE CURSOR_NOTARIOS 


El script completo

DECLARE CURSOR_NOTARIOS CURSOR FOR
	SELECT ID_NOTARIO, ID_NOTARIAS_ACTUAL 
	FROM NOTARIOS 
	WHERE PERTENECE = 1 AND ID_NOTARIAS_ACTUAL >1 AND ID_NOTARIAS_ACTUAL < 10
	ORDER BY ID_NOTARIO 

DECLARE @ID_NOTARIO INT
DECLARE @ID_NOTARIA INT 

OPEN CURSOR_NOTARIOS 
    FETCH NEXT FROM CURSOR_NOTARIOS 
    INTO @ID_NOTARIO, @ID_NOTARIA 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        PRINT 'HOLA ' + CAST( @ID_NOTARIO AS VARCHAR ) + ' ' 

        FETCH NEXT FROM CURSOR_NOTARIOS 
        INTO @ID_NOTARIO, @ID_NOTARIA 
    END 

CLOSE CURSOR_NOTARIOS 
DEALLOCATE CURSOR_NOTARIOS