2008-08-18 17 views
2

シーンを想像して、既存のSybaseコードを更新して、カーソルを見つけようとしています。ストアドプロシージャは、#temporaryテーブルに結果セットを作成します。#temporaryテーブルは、列のいずれかが人間が読める形式でないことを除いてすべて返される準備ができています。英数字のコードです。Sybase(T-SQL)でのカーソルの使用を避けるにはどうすればよいですか?

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 

:私たちが行う必要がある何

は、新たに解読値で結果セットを更新し、参照にこれらの控えめな値を横断する別のストアドプロシージャを呼び出し、このコードの可能性のある個別の値を把握していますさて、これはいくつかの人々の動悸を与えるかもしれませんが、それは動作します。私の質問は、どのようにこの種のことを避けるのが最善でしょうか?

_NB:この例では、結果セットが500k行の領域にあり、look_up_codeには100個の異なる値があり、最終的にはproc_code_xref内のロジックのxref値があまりにも曖昧です._

答えて

1

カーソルを取り出すには、XRefテーブルが必要です。 100個の異なるルックアップ値を知っていると仮定すると、100回proc_code_xrefを呼び出して結果をテーブルに挿入すると簡単に生成されます。

1

xref procでコードを複製しない限り、カーソルの使用を避ける方法はありません。

0

カーソルを使用する必要がある場合、間違ったことをしているに違いありません;-)カーソルなしの解法:

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 
関連する問題