0

以下のコードのように、テーブル値関数全体でカーソルがループしています。

    DECLARE db_cursor CURSOR FOR 
            SELECT *        
            from    [dbo].[GetStock]()
                    ...

私の質問は次のとおりです。カーソルは各反復で関数を実行しますか? ビューに対する同じ質問。
よろしく

4

1 に答える 1

0

カーソルの種類によって異なります。

  • 静的カーソルの場合は、SELECTを1回だけ実行し、結果を一時テーブルに配置して、一時テーブルから1つずつ結果を取得します。
  • 動的カーソルの場合は、クエリから1つずつ結果を取得します
  • キーセット駆動型カーソルの場合は、カーソルを開いたときに修飾する各行のキーを取得し、残りの列を1つずつ元のクエリから取得します。
  • 早送りカーソルの場合、結果に一意のキーがある場合は動的カーソルのように動作し、一意のキーがない場合は静的カーソルのように動作します。

カーソルのタイプに影響を与えるクエリに関していくつかの制限があります。ここにリストされています:暗黙的なカーソル変換の使用

sp_describe_cursorプロシージャを使用して、カーソルタイプを確認できます。コードサンプルについては、 sp_describe_cursorトピックを参照してください。

マルチステートメントUDFの場合、キーセット駆動型カーソル(結果テーブルに一意のキーがある場合)または静的カーソル(結果テーブルに一意のキーがない場合)を取得する可能性が最も高くなります。インラインUDFの場合、クエリと基になるテーブルによって異なります。

マルチステートメントUDFがあると思います。この場合、カーソルを宣言するときにSTATICを指定して、キーセット駆動型カーソルを回避する必要があります。

于 2012-12-22T06:01:34.793 に答える