7

T-SQLでは、カーソルは2つの方法で宣言できます(私が知っていることです)。

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor

いくつかのテストを実行していましたが、カーソル変数を作成しても、の結果にエントリが追加されないことに気付きましたsp_cursor_list

パフォーマンス、リソース使用率などの観点から、2番目のアプローチを使用することの長所/短所はありますか?

PS:カーソルのパフォーマンスの潜在的な問題を認識しています。カーソルとセットベースの比較は求めていません。または、カーソルwhileと一時/テーブル変数を使用します。

4

3 に答える 3

6

DECLARE @local_variable CURSOR私が発見した構文を使用することには、もう1つの利点があります。

この利点は、あるストアドプロシージャが別のストアドプロシージャを呼び出し、両方のプロシージャで同時にカーソルが開いている場合に発生します。DECLARE cursor_name CURSORがカーソルの定義に使用され、両方のプロシージャが同じcursor_nameを使用する場合、次のようになります。

メッセージ16915:「cursor_name」という名前のカーソルがすでに存在します。

一方、DECLARE @local_variable CURSOR親および子のストアドプロシージャでカーソルを定義するために使用される場合は、@local_variable各プロシージャに対してローカルであり、競合はありません。これまでこのメソッドを使用したことがない人のために@C、ローカル変数として使用する例を次に示します。

DECLARE @C AS CURSOR;

SET @C = CURSOR FOR SELECT ...;

OPEN @C;

FETCH NEXT FROM @C INTO ...;

..。

于 2013-06-06T20:30:17.557 に答える
4

私が読んだところによると、カーソル変数の目的は、ストアドプロシージャの出力変数として使用できるようにすることです。これにより、カーソル内のデータを別の制御プロシージャに送信できるようになります。私はこれを試したことがないので、それがどのように機能するか正確にはわかりませんが、それは私がBooksOnlineを読んで得たものです。測定可能なパフォーマンスの違いがあり、そもそもカーソルを使用しないことで得られる改善ではないことは確かです。これを出力変数として使用する予定がない場合は、より一般的なカーソル定義を使用すると、コードの保守が容易になる可能性があることをお勧めします。

とはいえ、実際にカーソルが必要になるケースはごくわずかです。

于 2010-11-22T18:38:50.807 に答える
0

私は可能な限りcursersを避けようとします(少なくともパフォーマンスについて考えるなら)。問題のセットベースのソリューションを作成してみてください。これらは通常、カーソルベースのソリューションよりもはるかに高速に処理されます。

于 2010-11-22T18:23:17.400 に答える