2008-08-18 7 views
2

Imaginez la scène, vous mettez à jour du code Sybase existant et vous rencontrez un curseur. La procédure stockée crée un ensemble de résultats dans une table #temporary qui est prête à être retournée sauf que l'une des colonnes n'est pas très lisible par l'homme, c'est un code alphanumérique.Comment éviter d'utiliser des curseurs dans Sybase (T-SQL)?

Ce que nous devons faire, est de déterminer les possibles valeurs distinctes de ce code, appelez une autre procédure stockée pour recouper ces valeurs discrètes, puis mettre à jour le jeu de résultats avec les nouvelles valeurs déchiffrés:

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 

Maintenant, alors que cela peut donner des palpitations à certains, cela fonctionne. Ma question est la suivante: comment éviter au mieux ce genre de chose?

_NB: pour les besoins de cet exemple, vous pouvez également imaginer que le jeu de résultats est dans la région de 500k lignes et qu'il y a 100 valeurs distinctes de look_up_code et enfin, qu'il n'est pas possible d'avoir une table avec les valeurs xref dans la logique dans proc_code_xref sont trop arcanes._

Répondre

1

Vous devez avoir une table XRef si vous voulez supprimer le curseur. En supposant que vous connaissez les 100 valeurs de recherche distinctes (et qu'elles sont statiques) il est facile de générer un en appelant proc_code_xref 100 fois et en insérant les résultats dans un tableau

1

À moins que vous ne souhaitiez dupliquer le code dans le processus xréf, il est impossible d'éviter d'utiliser un curseur.

0

Ils disent, que si vous devez utiliser le curseur, alors, vous doit avoir fait quelque chose de mal ;-) voici la solution sans curseur:

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 
Questions connexes