Pergunta

Imagine a cena, você está atualizando algum código legado do Sybase e se depara com um cursor.O procedimento armazenado cria um conjunto de resultados em uma tabela #temporary que está pronta para ser retornada, exceto que uma das colunas não é muito legível por humanos, é um código alfanumérico.

O que precisamos fazer é descobrir os possíveis valores distintos deste código, chamar outro procedimento armazenado para fazer referência cruzada a esses valores discretos e então atualizar o conjunto de resultados com os valores recém-decifrados:

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

Agora, embora isso possa causar palpitações em algumas pessoas, funciona.Minha pergunta é: qual a melhor forma de evitar esse tipo de coisa?

_Obs.:para efeitos deste exemplo você também pode imaginar que o conjunto de resultados está na região de 500k linhas e que existem 100 valores distintos de look_up_code e, finalmente, que não é possível ter uma tabela com os valores de refex como lógica em proc_code_xref é muito misterioso._

Foi útil?

Solução

Você precisa ter uma tabela XRef se quiser retirar o cursor.Supondo que você conheça os 100 valores de pesquisa distintos (e que eles sejam estáticos), é simples gerar um chamando proc_code_xref 100 vezes e inserindo os resultados em uma tabela

Outras dicas

A menos que você esteja disposto a duplicar o código no processo xref, não há como evitar o uso de um cursor.

Dizem que se você deve usar o cursor, então deve ter feito algo errado ;-) aqui está a solução sem cursor:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top