En T-SQL, al iterar los resultados de un cursor, parece ser una práctica común repetir la instrucción FETCH
antes del bucle WHILE
. El siguiente ejemplo de Microsoft:Cómo evitar el FETCH duplicado en T-SQL cuando se usa un cursor?
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title FROM AdventureWorks2012.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
(. Observe cómo FETCH NEXT FROM Employee_Cursor;
aparece dos veces)
Si el FETCH
selecciona en una larga lista de variables, entonces tenemos una gran declaración duplicada, que es a la vez feo y, por supuesto, , código "no SECO".
No estoy al tanto de una declaración de T-SQL de control de flujo posterior a la condición por lo que parece que tendría que recurrir a un WHILE(TRUE)
y luego BREAK
cuando @@FETCH_STATUS
no es cero. Esto me parece torpe.
¿Qué otras opciones tengo?
En código que se muestra, Sustituir el primer 'FETCH DESPUÉS de Employee_Cursor' con' GOTO Employee_Cursor_Fetch' y lugar etiqueta 'Employee_Cursor_Fetch:' inmediatamente antes de permanecer 'FETCH NEXT'. Puede observar que el nombre de la etiqueta se deriva del nombre del cursor ('Employee_Cursor') para evitar algunas consideraciones sobre los nombres de las etiquetas. – miroxlav