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._

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top