In T-SQL, quando si ripetono i risultati da un cursore, sembra essere prassi comune ripetere l'istruzione FETCH
prima del ciclo WHILE
. L'esempio che segue da Microsoft:Come evitare duplicati FETCH in T-SQL quando si utilizza un cursore?
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
(. Notate come FETCH NEXT FROM Employee_Cursor;
appare due volte)
Se il FETCH
seleziona in un lungo elenco di variabili, allora abbiamo una grande dichiarazione duplicato che è sia brutto e, naturalmente, , codice "non-DRY".
Io non sono a conoscenza di un'istruzione T-SQL controllo del flusso post-condizione così sembra che avrei dovuto ricorrere ad un WHILE(TRUE)
e poi BREAK
quando @@FETCH_STATUS
non è pari a zero. Questo mi sembra schifoso.
Quali altre opzioni ho?
Nel codice è mostrato, sostituire prima 'FETCH AVANTI DA Employee_Cursor' con' GOTO Employee_Cursor_Fetch' e luogo di etichetta 'Employee_Cursor_Fetch:' subito prima di rimanere 'FETCH NEXT'. Puoi notare che il nome dell'etichetta è derivato dal nome del cursore ('Employee_Cursor') per evitare di pensare ai nomi delle etichette. – miroxlav