2

シーンを想像してみてください。レガシーSybaseコードを更新していて、カーソルに出くわします。ストアドプロシージャは、結果セットを#temporaryテーブルに構築します。このテーブルは、列の1つが人間が読める形式ではなく、英数字のコードであることを除いて、すべて返される準備ができています。

このコードの可能な個別の値を把握し、別のストアドプロシージャを呼び出してこれらの個別の値を相互参照してから、新しく解読された値で結果セットを更新する必要があります。

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のロジックが難しすぎます。_

4

3 に答える 3

1

外部参照プロシージャでコードを複製する意思がない限り、カーソルの使用を避ける方法はありません。

于 2008-08-18T14:18:22.310 に答える
1

カーソルを取り出したい場合は、XRef テーブルが必要です。100 個の個別のルックアップ値を知っている (そしてそれらが静的である) と仮定すると、proc_code_xref を 100 回呼び出して結果をテーブルに挿入することで簡単に生成できます。

于 2008-08-18T14:33:03.343 に答える
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
于 2009-06-12T17:51:56.023 に答える