Come posso evitare di usare i cursori in Sybase (T-SQL)?
Domanda
Immaginate la scena, si stanno aggiornando alcuni legacy Sybase codice e venire attraverso un cursore.La stored procedure costruisce un set di risultati in un #tabella temporanea che è tutto pronto per essere restituiti, tranne che una delle colonne non è molto leggibile, è un codice alfanumerico.
Quello che dobbiamo fare, è capire i possibili valori distinti di questo codice, chiamare un'altra stored procedure cross riferimento a questi valori discreti e quindi aggiornare il set di risultati con la nuova decifrare i valori:
declare c_lookup_codes for
select distinct lookup_code
from #workinprogress
while(1=1)
begin
fetch c_lookup_codes into @lookup_code
if @@sqlstatus<>0
begin
break
end
exec proc_code_xref @lookup_code @xref_code OUTPUT
update #workinprogress
set xref = @xref_code
where lookup_code = @lookup_code
end
Ora, mentre questo può dare alcune persone palpitazioni, funziona.La mia domanda è, il modo migliore sarebbe quello di evitare questo genere di cose?
_NB:ai fini di questo esempio, si può anche immaginare che il set di risultati è nella regione di 500k righe e che ci sono 100 i valori distinti di look_up_code e, infine, che non è possibile avere una tabella con il xref valori come la logica proc_code_xref è troppo arcano._
Soluzione
Devi avere un XRef tabella se si vuole prendere il cursore.Supponendo che si conosce il 100 distinti valori di riferimento (e che sono statici) è un modo semplice per generare chiamando proc_code_xref 100 volte e inserire i risultati in una tabella
Altri suggerimenti
A meno che non siete disposti a duplicare il codice in xref proc, non c'è modo di evitare l'uso di un cursore.
Dicono, che se si deve usare il cursore, quindi, è necessario di avere fatto qualcosa di sbagliato ;-) ecco la soluzione senza cursore:
declare @lookup_code char(8)
select distinct lookup_code
into #lookup_codes
from #workinprogress
while 1=1
begin
select @lookup_code = lookup_code from #lookup_codes
if @@rowcount = 0 break
exec proc_code_xref @lookup_code @xref_code OUTPUT
delete #lookup_codes
where lookup_code = @lookup_code
end