2010-11-23 18 views
3

SQL Serverでカーソルを使用する代わりに、どのような方法がありますか。 私は既にRow_Number()関数を使って行を番号付けし、それを1つずつループするトリックを知っています。他のアイデア?SQLカーソルの代替手段

+3

多くの選択肢があります。現時点ではカーソルを含むいくつかのSQLコードを投稿すれば、それをセットベースのアプローチに変換することができます。 – NotMe

+0

あなたはwikiスタイルを探していますか?「一般的にカーソルを避けた方法は何ですか?」あなたは実際のシナリオを持っていますか?ここに魔法の弾丸はありません。実際のソリューションは、お客様のシナリオによって異なります。 – tenfour

+0

できればループとカーソルは避けてください。 SQLは、線形言語とは異なるセットベースの言語です。カーソルとループは、セットベースの言語に導入された線形ロジックです。ストーリーは短いので、ループやカーソルは避けてください...うまく設計されたスキーマでは、決して使用する必要はありません。 – Twelfth

答えて

8

SQLカーソルを使用することを複雑にしたくないときは、一時テーブルやテーブル変数を設定することがよくありますが、whileループを実行します。例えば

declare @someresults table (
    id int, 
    somevalue varchar(10) 
) 

insert into @someresults 
    select 
     id, 
     somevalue 
    from 
     whatevertable 

declare @currentid int 
declare @currentvalue varchar(10) 

while exists(select 1 from @someresults) 
begin 
    select top 1 @currentid = id, @currentvalue = somevalue from @someresults 

    --work with those values here 

    delete from @someresults where id = @currentid 
end 
2

いくつかのオプション:

  1. ベストは数学セットベースの観点から再分析の問題です。これが可能ならば、それは最も可能性が高いと思われます。
  2. 第二には、のみキーを保存するために一時テーブル変数を使用します。可能であれば、再帰的なCommonテーブル式を使用してキーをこの一時テーブル変数に挿入するか、T-SQLプログラミングループを使用して(Where句または何らかの種類の反復ループを構築する)、tempテーブル変数にその中のキー値を使用して、実際のSQL設計目標がどんなものであっても、実際の表に適切な方法で結合して実行してください...反復的または反復的にキーを使用して、高価な建設フェーズでは可能です...
  3. 上記と同様の方法で一時テーブル(ディスク上)を使用してください。これは、この一時テーブル変数が複数の列や非常に大きな(> 1M)行数を含むようにするために、または一時テーブルに主キー索引以上のものを含める必要がある場合に、より良い選択です。 ..