次の方法で共有


sp_cursorfetch (Transact-SQL)

データベースから 1 つ以上の行のバッファーをフェッチします。このバッファー内にある行のグループをカーソルのフェッチ バッファーと呼びます。sp_cursorfetch は、ID = 7 を指定した場合に表形式のデータ ストリーム (TDS) パケットで呼び出されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

        sp_cursorfetch 
        cursor
        
        
            [ , fetchtype[ , rownum [ , nrows] ]] 

引数

  • cursor
    SQL Server によって生成され、sp_cursoropen から返されるハンドル値です。cursor は、int 入力値を必要とする必須パラメーターです。詳細については、後の「解説」を参照してください。

  • fetchtype
    フェッチするカーソル バッファーを指定します。fetchtype は省略可能なパラメーターで、次の整数入力値のいずれかを必要とします。

    名前

    説明

    0x0001

    FIRST

    先頭 nrows 行のバッファーをフェッチします。nrows が 0 の場合は、カーソルが結果セットの前に置かれ、行は返されません。

    0x0002

    NEXT

    次の nrows 行のバッファーをフェッチします。

    0x0004

    PREV

    前の nrows 行のバッファーをフェッチします。

    注意
       FORWARD_ONLY では一方向のスクロールしかサポートされていないため、FORWARD_ONLY カーソルに対して PREV を使用するとエラー メッセージが返されます。

    0x0008

    LAST

    末尾 nrows 行のバッファーをフェッチします。nrows が 0 の場合は、カーソルが結果セットの後ろに置かれ、行は返されません。

    注意
       FORWARD_ONLY では一方向のスクロールしかサポートされていないため、FORWARD_ONLY カーソルに対して LAST を使用するとエラー メッセージが返されます。

    0x10

    ABSOLUTE

    rownum 行目から nrows 行分のバッファーをフェッチします。

    注意
       FORWARD_ONLY では一方向のスクロールしかサポートされていないため、DYNAMIC カーソルまたは FORWARD_ONLY カーソルに対して ABSOLUTE を使用するとエラー メッセージが返されます。

    0x20

    RELATIVE

    現在のブロックの先頭行から数えて rownum 番目の行から nrows 行分のバッファーをフェッチします。この場合、rownum に負の値を指定することができます。

    注意
       FORWARD_ONLY では一方向のスクロールしかサポートされていないため、FORWARD_ONLY カーソルに対して RELATIVE を使用するとエラー メッセージが返されます。

    0x80

    REFRESH

    基になるテーブルのデータをバッファーに再読み込みします。

    0x100

    INFO

    カーソルについての情報を取得します。この情報は、rownum パラメーターと nrows パラメーターを使用して返されます。したがって、INFO を指定すると、rownum と nrows は出力パラメーターになります。

    0x200

    PREV_NOADJUST

    PREV と同じように使用されますが、途中で結果セットの先頭に到達した場合に結果が変わる可能性があります。

    0x400

    SKIP_UPDT_CNCY

    INFO 以外の他の fetchtype 値と共に使用する必要があります。

    注意

       値 0x40 はサポートされていません。

    詳細については、後の「解説」を参照してください。

  • rownum
    省略可能なパラメーターです。fetchtype の値が ABSOLUTE または INFO の場合に、入力または出力あるいはその両方で、整数値のみを使用して行の位置を指定するために使用されます。fetchtype のビット値が RELATIVE の場合は、行オフセットとして機能します。他のすべての値では無視されます。詳細については、後の「解説」を参照してください。

  • nrows
    フェッチする行数を指定するために使用される省略可能なパラメーターです。nrows を指定しない場合の既定値は 20 行です。データを返さずに位置を設定するには、値 0 を指定します。fetchtype が INFO であるクエリに nrows を適用した場合は、そのクエリの行の総数が返されます。

    注意

       nrows は、fetchtype のビット値が REFRESH の場合には無視されます。

    詳細については、後の「解説」を参照してください。

リターン コード値

ビット値 INFO を指定した場合の戻り値を次の表に示します。

注意

   行が返されない場合、バッファーの内容は元のままになります。

<rownum>

開いていない場合

0

結果セットより前の場合

0

結果セットより後ろの場合

-1

KEYSET カーソルおよび STATIC カーソルの場合

結果セット内の現在位置の絶対行番号。

DYNAMIC カーソルの場合

1

ABSOLUTE の場合

-1 を指定すると、セット内の最後の行が返されます。

-2 を指定すると、セット内の最後から 2 番目の行が返されます (以降、同様に続きます)。

注意
この場合に複数の行をフェッチするように要求すると、結果セットの最後の 2 行が返されます。

<nrows>

開いていない場合

0

KEYSET カーソルおよび STATIC カーソルの場合

通常は現在のキーセットのサイズ。

カーソルが非同期に作成される場合は -m。m は、その時点までに見つかった行の数です。

DYNAMIC カーソルの場合

-1

説明

cursor パラメーター

フェッチ操作がまだ一度も行われていないときのカーソルの既定の位置は、結果セットの最初の行の前です。

fetchtype パラメーター

SKIP_UPD_CNCY を除き、複数の fetchtype 値を同時に指定することはできません。

SKIP_UPDT_CNCY を指定すると、行がフェッチまたは更新されるときに timestamp 列の値が keyset テーブルに書き込まれません。行が更新された場合は timestamp 列の値が前の値のままになり、行が挿入された場合は timestamp 列の値が未定義になります。

その結果、KEYSET カーソルでは、keyset テーブルの値が、前回通常の FETCH が実行されたときに設定された値か (通常の FETCH が実行されている場合)、作成時に設定された値になります (通常の FETCH が実行されていない場合)。

DYNAMIC カーソルでは、REFRESH でスキップが行われる場合には KEYSET と同じ結果になりますが、その他の fetchtype では keyset テーブルが切り捨てられます (行が挿入され、timestamp 列の値が未定義になります)。このため、DYNAMIC カーソルで sp_cursorfetch を実行する際には、REFRESH 以外の操作に対して SKIP_UPDT_CNCY を使用しないようにしてください。

要求したカーソル位置が結果セットの範囲を超えていたためにフェッチ操作が失敗した場合は、カーソル位置が最後の行の直後に設定されます。要求したカーソル位置が結果セットより前だったためにフェッチ操作が失敗した場合は、カーソル位置が最初の行の前に設定されます。

rownum パラメーター

rownum を使用すると、指定された行からバッファーの読み込みが開始されます。

fetchtype の値が ABSOLUTE である場合、結果セット全体の中での rownum 位置を指しています。ABSOLUTE で負の値を指定すると、結果セットの末尾から行がカウントされます。

fetchtype の値が RELATIVE の場合、現在のバッファーの先頭のカーソル位置を基準にした rownum 位置を指しています。RELATIVE で負の値を指定すると、カーソルが現在のカーソル位置から後方に移動します。

nrows パラメーター

このパラメーターは、fetchtype の値が REFRESH および INFO である場合には無視されます。

fetchtype の値を FIRST に指定した場合に nrow の値を 0 にすると、カーソルが結果セットの前に置かれ、フェッチ バッファーに行が含まれません。

fetchtype の値を LAST に指定した場合に nrow の値を 0 にすると、カーソルが結果セットの後ろに置かれ、現在のフェッチ バッファーに行が含まれません。

fetchtype の値が NEXT、PREV、ABSOLUTE、RELATIVE、および PREV_NOADJUST である場合、nrow の値を 0 にすることはできません。

RPC に関する考慮事項

RPC の戻りステータスでは、キーセット サイズのパラメーターが final かどうか (keyset テーブル (一時テーブル) が非同期に作成されるかどうか) が示されます。

RPC 状態パラメーターは、次のいずれかの値に設定されます。

説明

0

プロシージャは正常に実行されました。

0x0001

プロシージャは失敗しました。

0x0002

負の方向のフェッチにより、カーソル位置が結果セットの先頭に設定されました (論理的には、結果セットの前でフェッチが行われるはずでした)。

0x10

高速順方向カーソルが自動的に閉じられました。

行は、通常の結果セットとして返されます (列の形式 (0x2a)、行 (0xd1)、完了 (0xfd))。メタデータ トークンは、sp_cursoropen に指定したのと同じ形式で送信されます (SQL Server 7.0 ユーザーの場合は 0x81、0xa5、0xa4 など)。行の状態インジケーターは、ブラウズ モードのように、各行の末尾の非表示の列として送信されます (列名は rowstat、データ型は INT4)。この rowstat 列には、次のいずれかの値が含まれます。

説明

0x0001

FETCH_SUCCEEDED

0x0002

FETCH_MISSING

TDS プロトコルでは、前の列を送信せずに末尾の状態列だけを送信することはできないため、欠けている行に対してはダミー データが送信されます (NULL 値許容フィールドは NULL に設定され、固定長フィールドは 0、空白、または列の既定値に設定されます)。

DONE の行数は常に 0 になります。DONE メッセージに結果セットの実際の行数が含まれます。TDS メッセージの間にエラー メッセージや情報メッセージが表示される場合もあります。

カーソルの選択リストに関するメタデータを TDS ストリームで返すように要求するには、RPC の RETURN_METADATA 入力フラグを 1 に設定します。

A. PREV を使用してカーソル位置を変更する

カーソル h2 で、次の内容を含む結果セットが生成されるとします。current position は現在の位置を示します。

row 1 contents    
row 2 contents
row 3 contents
row 4 contents  <-- current position
row 5 contents 
row 6 contents

ここで、nrows の値を 5 に設定して sp_cursorfetch PREV を実行すると、論理的には、カーソルが結果セットの最初の行の 2 行前に置かれます。このような場合、カーソルが最初の行で開始されるように調整されて、要求した数の行が返されます。その結果、通常は、前のフェッチ バッファーに含まれていた行が返されることになります。

注意

 これは、RPC 状態パラメーターが 2 に設定される典型的な例です。

B. PREV_NOADJUST を使用して PREV より少ない行を返す

PREV_NOADJUST では、返される行のブロックに現在のカーソル位置以降の行が含まれることはありません。PREV では現在の位置より後ろの行が返されるケースで PREV_NOADJUST を使用すると、返される行が nrows で要求した行数より少なくなります。たとえば、前の例 A の現在位置で PREV を適用した場合、sp_cursorfetch(h2, 4, 1, 5) で次の行がフェッチされます。

row1 contents 
row2 contents
row3 contents
row4 contents
row5 contents

一方、PREV_NOADJUST を適用した場合は、sp_cursorfetch(h2, 512, 6, 5) で次の行のみがフェッチされます。

row1 contents 
row2 contents
row3 contents