web-dev-qa-db-ja.com

whileループでカーソルなどを使用するには?

ネットを読んでみると、カーソルの使用は眉をひそめているようですが、誰もカーソルに代わるものを提供していないようです。私の場合、selectステートメントの結果を行ごとに設定し、各行のいくつかの列を別のストアドプロシージャに渡して処理する必要があります。これを行う唯一の方法は、カーソルを作成し、whileループを実行してカーソルを使用して各行を取得し、データを処理できるようにすることです。では、カーソルを使用してselectステートメントの各行をステップ実行し、これを行うための最良の方法を処理しているのでしょうか、それとも別の方法がありますか?私の場合、すべての行が処理されることを確認する必要があります。

1

理想的には、他のストアドプロシージャを変更して、個々の値を取得するのではなく、セットで機能するようにする必要があります(または、セットで機能する新しいストアドプロシージャを作成します)。高レベルのプロセスを文章題として説明するだけでなく、影響を受けるテーブルのプロシージャとスキーマに実際のロジックを表示すると、それについていくつかのアイデアを得ることができます。プロシージャを複数回呼び出さないようにする1つの方法は、 table-valued parameter を使用して異なる行の値を単一のセットとして渡すことです(ただし、これもプロシージャを書き直すか、新しいを作成する必要があります1)。

それまでの間、どうしてもループを使用する必要がある場合は、パフォーマンスへの影響も受け入れる必要があります。これらを相殺する1つの方法(実際にカーソルを読み取り専用のシングルパスとしてセットを使用している場合)は、カーソルを宣言するときに次のキーワードを使用することです。

DECLARE c CURSOR LOCAL FAST_FORWARD
FOR SELECT ...

詳細はこちら:

http://www.sqlperformance.com/2012/09/t-sql-queries/cursor-options

4
Aaron Bertrand