Utilizzo di cursori con ORDER BY

di il
2 risposte

Utilizzo di cursori con ORDER BY

Ho creato una stored procedure che mi deve restituire una tabella così definita
DECLARE @Riepilogo table
(
Id int identity(1,1),
DataReg datetime,
CodEsercizio smallint,
CodArt varchar(25),
UM varchar(4),
Qta float,
ImpUnit float,
CM_Unit float
)
Quindi riempio la tabella con una semplice query

A questo punto dichiaro un cursore
DECLARE mov_cursor CURSOR FOR
SELECT CodArt, CodEsercizio, Qta, ImpUnit
FROM @Riepilogo
ORDER BY CodArt, DataReg
FOR UPDATE OF CM_Unit

OPEN mov_cursor 
FETCH NEXT FROM mov_cursor INTO @CodArt, @CodEsercizio, @Qta, @ImpUnit
WHILE (@@FETCH_STATUS=0)
  BEGIN
     .....
     -- Qui faccio dei calcoli su @cm
     UPDATE @Riepilogo set CM_Unit=@cm where current of mov_cursor
	FETCH NEXT FROM mov_cursor INTO @CodArt, @CodEsercizio, @Qta, @ImpUnit
  END
  CLOSE mov_cursor
  DEALLOCATE mov_cursor
END

SELECT DataReg, CodEsercizio, CodArt, UM, Qta, ImpUnit, CM_Unit
FROM @Riepilogo
Quando eseguo la stored, vedo per un attimo (nemmeno un secondo vedo la tabella), ma poi mi vengono mostrati dei messaggi
Messaggio 16929, livello 16, stato 1, procedura NSPCalcoloCM, riga 82
Il cursore è READ ONLY.
L'istruzione è stata interrotta.

Cosa sbaglio?


Come alternativa ho pensato di inserire i record nella tabella @Riepilogo già ordinati tramite la query di INSERT.
Poi però sono sicura che il cursore scorre i record nell'ordine in cui sono inseriti (quindi rispettando l'ordinamento)? Dalle prove che ho fatto non sono riuscita a capire ben...

Grazie per l'aiuto

2 Risposte

  • Re: Utilizzo di cursori con ORDER BY

    La select sulla tabella temporanea devi eseguirla all'interno del corpo della stored. Il popolamento della tabella avviene all'interno della stored? Prova a postare l'intero script.
  • Re: Utilizzo di cursori con ORDER BY

    Chiedo scusa se non ho risposto prima, ma mi era sfuggita la risposta al mio post.
    Nel frattempo ho trovato una soluzione alternativa. Grazie comunque.
Devi accedere o registrarti per scrivere nel forum
2 risposte