Newsgroup: it.comp.software.database
Titolo: Cursori

Ciao a tutti, volevo chiedere se esisteva un modo per selezionare dei dati
da una variabile di Tipo Cursore, ovvero dato il seguente cursore:
SET @CursorVar = CURSOR SCROLL DYNAMIC FOR Select top 20000 *  from Tabella
OPEN @CursorVar
fetch Next from @CursorVar
while @@FETCH_STATUS = 0
begin
 fetch Next from @CursorVar
 /*print @CursorVar*/
 set @C=@C+1
end
close @CursorVar
deallocate @CursorVar
Come posso fare delle ricerche su di esso : Ad es "Select * from @CursorVar
where ...."
E poi ancora: Posso accedere direttamente a @CursorVar.Nomecampo o devo per
forza usare Fetch Next From @CursorVar into VariaBili? Se si in che modo?
E poi posso Usare i cursori per inserire dati in una tabella?
(Ho spulciato nella guida ma ho visto solo esempi per modifiche o per
delete)
Ciao e grazie

 E poi posso Usare i cursori per inserire dati in una tabella?
Non puoi. Per inserire i dati usa INSERT INTO.
Davide

Innanzitutto Grazie per aver risposto.
Vorrei ancora una dritta per partire col piede giusto, Non voglio pezzi di
codice ma solo un consiglio.
Il problema:
1) creare una Tabella Temporanea con un nome Univoco.
2) Apro un cursore su una Certa select, scorrerlo fino alla fine.
3) Per ogni riga ricercare nella Tabella Temporanea a paritą di chiave, se
non esiste appendo, altrimenti faccio l'update nel Temporaneo.
Io ho pensato a questo:
1) Passo alla Sp un parametro con il nome della tabella, al suo interno
genero la creazione della tabella: EXEC CREATE TABLE.....
2)Non ci sono problemi
3)Il problema consiste nel fatto che la tabella non ha un nome fisso, quindi
dovrei fare tutto con una sp (penso).
Nelle sp ci sono i Goto Istruzione? Se si sono a posto...
E' ottimizzato questo codice?
WHILE (@@FETCH_STATUS  =0 )
BEGIN
    FETCH NEXT FROM Cursore in @Variabile
    SET @VAR=0
    Select @VAR= ID  From Temporanea where ...
    IF @VAR<>0 THEN
        INSERT INTO TEMPORANEA (CAMPO1,CAMPO2,,,) VALUES(1,2,3)
    ELSE
        UPDATE TEMPORANEA SET CAMPO = VALORE WHERE CURRENT OF Cursore
    ENDIF
END
Il Problema č il nome della tabella...
Non posso passarlo come parametro, come faccio?
Ciao e grazie
Oz

 Non posso passarlo come parametro, come faccio?
Io sapevo che si poteva fare... non l'ho mai fatto con SQL Server,
pero' l'ho fatto con Oracle...
Se proprio non c'e' modo la soluzione e'.... una SP per ogni tabella...
Davide

 Se proprio non c'e' modo la soluzione e'.... una SP per ogni tabella...
Si, ma se la tabella viene creata al momento con un nome del tipo
TEMP_UTENTE_3244445612 come faccio??
Mi fai un esempio di dichiarazione di etichetta-Goto?
Ciao Grazie
Oz

 Mi fai un esempio di dichiarazione di etichetta-Goto?
Non li ho mai usati in vita mia... guarda sulla documentazione,
forse fai meglio.
Davide

 tabelle con nomi strampalati da eliminare) e piu' facile da farsi.
E' che le nostre tabelle temporanee sono tante..il programma è pieno di
elaborazioni..
E se usassi l'istruzione Exec 'select * from ' + parametro + ' where....' e
poi controllo  la @@rowcount?
potrei fare:
if @@rowcount >0 then
    'update
    exec 'update .....
else
    'add new
    exec 'insert into .....
end if
La @@rowcount è una variabile globale alla Sp?Se si dovrebbe funzionare...
Ciao
Grazie
Oz

 La @@rowcount č una variabile globale alla Sp?Se si dovrebbe funzionare...
La @@rowcount e' locale del singolo cursore... non so che dire: prova!
Davide

data la seguente sp:
CREATE PROCEDURE [PROVA] AS
exec sp_sqlexec 'select top 1 * from tabella'
print '1° selezione : ' + str(@@rowcount)
exec sp_sqlexec 'select top 2 * from tabella'
print '2° selezione : ' + str(@@rowcount)
exec sp_sqlexec 'select top 3 * from tabella'
print '3° selezione : ' + str(@@rowcount)
exec sp_sqlexec 'select top 4 * from tabella'
print '4° selezione : ' + str(@@rowcount)
END
Il risultato è .
1° selezione :          1
2° selezione :          2
3° selezione :          3
4° selezione :          4
Quindi tutto Ok!!!
Non vorrei che poi in Sql2000 non cambi la faccenda....
Speriamo...
A proposito per non visualizzare i dati/messaggi delle righe ritornate cosa
devo impostare/Settare?
Ciao e grazie
Oz