sp_cursor (Transact-SQL)

適用対象:SQL Server

配置された更新を要求します。 このプロシージャは、カーソルのフェッチ バッファー内にある 1 つ以上の行に対して操作を実行します。 sp_cursorは、表形式データ ストリーム (TDS) パケットで ID = 1 を指定することによって呼び出されます。

適用対象: SQL Server (SQL Server 2008 (10.0.x) から現在のバージョンまで)。

Transact-SQL 構文表記規則

構文

  
sp_cursor  cursor, optype, rownum, table  
    [ , value[...n]]]  

引数

cursor
カーソル ハンドルです。 cursor は、 int 入力値を呼び出す必須パラメーターです。 cursor は、SQL Serverによって生成され、sp_cursoropen プロシージャによって返されるハンドル値です。

optype
カーソルが実行する操作を指定する必須パラメーターです。 optype には、次のいずれかの int 入力値が必要です。

名前 説明
0X0001 UPDATE フェッチ バッファー内の 1 つ以上の行を更新するために使用されます。 rownum で指定された行に再アクセスして更新します。
0x0002 DELETE フェッチ バッファー内の 1 つ以上の行を削除するために使用されます。 rownum で指定された行に再アクセスして削除します。
0X0004 INSERT SQL INSERT ステートメントを作成せずにデータを 挿入 します。
0X0008 REFRESH 基になるテーブルからバッファーを補充するために使用され、オプティミスティック コンカレンシー制御によって更新または削除が失敗した場合、または UPDATE の後で行を更新するために使用できます。
0X10 LOCK 指定した行を含むページで、SQL Server U-Lock を取得します。 このロックは S-Locks と互換性がありますが、X ロックやその他の U ロックとは互換性がありません。 短期間のロックを実装する場合に使用できます。
0X20 SETPOSITION プログラムが後続の位置指定 DELETE ステートメントまたは UPDATE ステートメントSQL Server出す場合にのみ使用されます。
0X40 ABSOLUTE UPDATE または DELETE との組み合わせでのみ使用できます。 ABSOLUTE は KEYSET カーソルでのみ使用されます (DYNAMIC カーソルでは無視されます。STATIC カーソルは更新できません)。

注: フェッチされていないキーセットの行に ABSOLUTE が指定されている場合、操作はコンカレンシー チェックに失敗する可能性があり、戻り値の結果は保証されません。

Rownum
カーソルが操作、更新、または削除するフェッチ バッファー内の行を指定します。

注意

これは、RELATIVE、NEXT、PREVIOUS のフェッチ操作の開始点にも、sp_cursorを使用して実行された更新または削除にも影響しません。

rownum は、 int 入力値を呼び出す必須パラメーターです。

1
フェッチ バッファーの最初の行を示します。

2
フェッチ バッファー内の 2 行目を示します。

3、4、5
3 番目、4 番目、5 番目の行を示します。

n
フェッチ バッファー内の n 番目の行を示します。

0
フェッチ バッファー内のすべての行を示します。

注意

UPDATE、DELETE、REFRESH、または LOCK 操作型 の値で使用する場合にのみ有効です。

テーブル
カーソル定義に結合またはあいまいな列名が含まれる場合に optype が適用されるテーブルを識別するテーブル名は、 value パラメーターによって返されます。 特定のテーブルを指定しない場合、既定値は FROM 句の最初のテーブルになります。 table は、String 入力値を必要とする省略可能なパラメーターです。 文字列は、任意の文字または UNICODE データ型として指定できます。 table には、複数の部分から成るテーブル名を指定できます。

value
値を挿入または更新する場合に使用します。 文字列パラメーターは、UPDATE および INSERT optype 値でのみ使用されます。 文字列は、任意の文字または UNICODE データ型として指定できます。

注意

のパラメーター名は、ユーザーが割り当てることができます。

リターン コードの値

RPC を使用する場合、バッファー番号が 0 の位置指定された DELETE または UPDATE 操作は、フェッチ バッファー内のすべての行に対して 0 (失敗) または 1 (成功) の 行数 を持つ DONE メッセージを返します。

解説

optype パラメーター

SETPOSITION と UPDATE、DELETE、REFRESH、または LOCK の組み合わせを除く。または ABSOLUTE と UPDATE または DELETE のどちらかを指定すると、 optype 値は相互に排他的です。

UPDATE 値の SET 句は、 value パラメーターから構築されます。

INSERT optype 値を使用する利点の 1 つは、文字以外のデータを挿入用の文字形式に変換しないようにできることです。 値は UPDATE と同じ方法で指定されます。 必須の列が含まれていない場合、INSERT は失敗します。

  • SETPOSITION の値は、RELATIVE、NEXT、または PREVIOUS のフェッチ操作の開始位置や、sp_cursor インターフェイスを使用して実行される更新や削除には影響しません。 フェッチ バッファー内の行を指定しない数値を指定すると、位置は 1 に設定され、エラーは返されません。 SETPOSITION が実行されると、次のsp_cursorfetch操作、T-SQL FETCH 操作、または同じカーソルを介して SETPOSITION 操作をsp_cursorするまで、位置は有効なままになります。 後続のsp_cursorfetch操作では、カーソルの位置が新しいフェッチ バッファーの最初の行に設定されますが、他のカーソル呼び出しは位置の値には影響しません。 SETPOSITION は、位置の値を最後に変更された行に設定するために、REFRESH、UPDATE、DELETE、または LOCK を使用して OR 句によってリンクできます。

フェッチ バッファー内の行が rownum パラメーターで指定されていない場合、位置は 1 に設定され、エラーは返されません。 設定された位置は、同じカーソルを使用して次の sp_cursorfetch 操作、T-SQL FETCH 操作、または sp_cursor SETPOSITION 操作が行われるまで有効なままになります。

SETPOSITION は、REFRESH、UPDATE、DELETE、または LOCK を使用して OR 句によってリンクされ、カーソル位置を最後に変更された行に設定します。

rownum パラメーター

指定した場合、 rownum パラメーターは、フェッチ バッファー内の行番号ではなく、キーセット内の行番号として解釈できます。 コンカレンシー制御はユーザーが管理する必要があります。 したがって、SCROLL_LOCKS カーソルの場合はその行のロックを独自に保持し (トランザクションを使用できます)、 OPTIMISTIC カーソルの場合は、この操作を実行する前にその行をフェッチしておく必要があります。

table パラメーター

optype 値が UPDATE または INSERT で、値パラメーターとして完全な更新ステートメントまたは insert ステートメントが送信された場合、table に指定された値は無視されます。

注意

ビューに関連して、ビューに参加しているテーブルは 1 つだけ変更できます。 パラメーターの列名にはビュー内の列名を反映する必要がありますが、テーブル名は基になるベース テーブルの名前にすることができます (この場合、sp_cursorはビュー名に置き換わります)。

value Parameter

前の「引数」セクションで説明したように 、値 を使用するための規則には、次の 2 つの方法があります。

  1. 名前付き パラメーターには、select-list 内の列の名前に事前にペン付けされた名前 '@' を使用できます。 この方法には、データ変換が不要になる可能性があるという利点があります。

  2. パラメーターを使用して、完全な UPDATE ステートメントまたは INSERT ステートメントを送信するか、複数のパラメーターを使用して UPDATE ステートメントまたは INSERT ステートメントの一部を送信し、SQL Server完全なステートメントに組み込みます。 この例については、このトピックの後半の「例」セクションを参照してください。

代替値 パラメーターの使用

UPDATE の場合:

1 つのパラメーターを使用する場合は、次の構文を使用して UPDATE ステートメントを送信できます。

[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]

注意

UPDATE <テーブル名> を指定した場合、 table パラメーターに指定された値はすべて無視されます。

複数のパラメーターを使用する場合、最初のパラメーターは次の形式の文字列である必要があります。

[ SET ] <column name> = expression [,...n]

以降のパラメーターは、次の形式である必要があります。

<column name> = expression [,...n]

この場合、 <構築された update ステートメントのテーブル名> は、 table パラメーターによって指定または既定値になります。

INSERT の場合:

1 つのパラメーターを使用する場合は、次の構文を使用して INSERT ステートメントを送信できます。

[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )

注意

INSERT <テーブル名> を指定した場合、 table パラメーターに指定された値はすべて無視されます。

複数のパラメーターを使用する場合、最初のパラメーターは次の形式の文字列である必要があります。

[ VALUES ( ] <expression> [,...n]

以降のパラメーターは、次の形式である必要があります。

expression [,...n]

VALUES が指定されている場合を除き、最後の式の後に末尾の ")" が必要です。 この場合、<構築された UPDATE ステートメントのテーブル名>は、table パラメーターによって指定されるか、既定で に設定されます。

注意

1 つのパラメーターを名前付きパラメーターとして送信することもできます ("@VALUES" など)。 この場合、他の名前付きパラメーターは使用できません。

参照

sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
システム ストアド プロシージャ (Transact-SQL)