2012-03-06 39 views
0

ストアド・プロシージャに2つのカーソル(CRSX1、CRSX2など)があります。それは実装する必要がある入れ子のwhileループロジックのようなものです。 CRSX1が開いているときに2番目のカーソルCRSX2を使用できますか?2番目のカーソルを使用する前に最初のカーソルを閉じる必要がありますか。ストアド・プロシージャ内の複数のカーソルの処理

それとも私たちは事前にSQL Server内のループ

おかげで

+1

ベストオプション:カーソルを完全に取り除くことができます。 –

答えて

2

カーソルをネストすることはできますが、可能であればSETベースの操作のためにカーソルを削除する必要があります。それ以外の場合は、特に大量のデータを使用するとパフォーマンスが上がらない可能性があります。私は最後の手段としてカーソル/ループのみを使用します。

さらなる説明は:( - 苦渋行ごとRBAR)
カーソルを使用すると、特定の操作を実行するための行によって反復ラウンド、行であろうことを意味します。これは、一度に1組のデータ(すなわち、セットベース)上で単一の非ループ様式で操作を実行するのと同じくらい効率的ではない。

テーブルの行数をカウントするための粗い例。

オプション1:厄介なRBAR方法、テーブル上でカーソルを開いて、ループを丸め、カウンタ変数をインクリメントします。

オプション2:素晴らしいセットベースのアプローチ、単一の実行などの選択:SELECT COUNT(*) FROM YourTable

だから私は何を意味するか、あなたが望む結果を達成するためにセットベースのアプローチを見つけるためにあなたのSQLをリファクタリングしようとしています。一般的に、ループ/カーソルアプローチをセットベースのアプローチに置き換えることができない時間はほとんどありません。

+0

SETベースの操作の意味を詳しく説明できますか? –

+0

@ user653622 - 完了しました、私の答えで更新を見てください – AdaTheDev

1

あなたはネストされたカーソルを持つことができますが、二重のためのロジックを実装する必要がある場合は周りの他の方法がありますが、あなたは/オープン宣言する必要があります外側のカーソルのWHILEループ内の内側のカーソルを/取り出し/閉じる/割り当てを解除します。

関連する問題