sp_cursor (Transact-SQL)
位置指定更新を要求します。 このプロシージャは、カーソルのフェッチ バッファー内にある 1 つ以上の行に対して操作を実行します。 sp_cursor は、ID = 1 を指定した場合に表形式のデータ ストリーム (TDS) パケットで呼び出されます。
適用対象: SQL Server (SQL Server 2008 から現在のバージョンまで) |
構文
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 ロックを取得します。 このロックは、S ロックとは互換性がありますが、X ロックや他の U ロックとは互換性がありません。 短期間のロックを実装する場合に使用できます。
0X20
SETPOSITION
SQL Server の位置指定の DELETE または UPDATE ステートメントをプログラムで続けて実行する場合にのみ使用されます。
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
フェッチ バッファー内のすべての行を示します。注意
optype の値が UPDATE、DELETE、REFRESH、または LOCK の場合にのみ有効です。
table
カーソル定義に結合が含まれている場合や、value パラメーターによってあいまいな列名が返された場合に、optype が適用されるテーブルを識別するテーブル名です。 特定のテーブルを指定しない場合、既定値は FROM 句の最初のテーブルになります。 table は省略可能なパラメーターで、文字列入力値を必要とします。 文字列は、任意の文字または UNICODE データ型として指定できます。 table にはマルチパートのテーブル名を指定できます。value
値を挿入または更新する場合に使用します。 value 文字列パラメーターは、optype の値が UPDATE または INSERT の場合にのみ使用されます。 文字列は、任意の文字または UNICODE データ型として指定できます。注意
value のパラメーター名はユーザーが指定できます。
リターン コード値
RPC を使用している場合に、バッファー番号 0 で位置指定の DELETE 操作または UPDATE 操作を実行すると、フェッチ バッファー内のすべての行について 0 (失敗) または 1 (成功) の rowcount を含む DONE メッセージが返されます。
説明
optype パラメーター
SETPOSITION と UPDATE、DELETE、REFRESH、または LOCK との組み合わせと、ABSOLUTE と UPDATE または DELETE との組み合わせを除いて、optype 値は同時に指定できません。
UPDATE 値の SET 句は value パラメーターから作成されます。
optype の値に INSERT を使用する場合は、文字以外のデータを挿入のために文字形式に変換する必要がないという利点があります。 値の指定方法は UPDATE と同じです。 必須の列が含まれていない場合、INSERT は失敗します。
- SETPOSITION の値は、RELATIVE、NEXT、または PREVIOUS のフェッチ操作の開始位置、あるいは sp_cursor インターフェイスを使用して実行される更新や削除には影響しません。 値がフェッチ バッファー内の行を指定していない場合は、位置が 1 に設定され、エラーは返されません。 SETPOSITION の実行によって設定された位置は、同じカーソルを使用して次の sp_cursorfetch 操作、T-SQL FETCH 操作、または sp_cursor SETPOSITION 操作が行われるまで有効なままになります。 次の操作が 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 で、更新または挿入の完全なステートメントが value パラメーターとして送信された場合は、table に指定された値は無視されます。
注意
ビューに関しては、変更できるのはビューに参加している 1 つのテーブルだけです。value パラメーターの列名にはビューの列名が反映されている必要がありますが、テーブル名には、基になるベース テーブルの名前を使用できます (その場合、sp_cursor では代わりにビュー名が使用されます)。
value パラメーター
「引数」でも述べたように、value には次の 2 つの使用方法があります。
選択リスト内の列の名前の先頭に '@' を付けた名前を、名前付き value パラメーターとして使用できます。 この方法には、データ変換が不要になる可能性があるという利点があります。
1 つのパラメーターを使用して完全な UPDATE ステートメントや INSERT ステートメントを送信するか、複数のパラメーターを使用して UPDATE ステートメントや INSERT ステートメントの一部を送信します。複数のパラメーターを使用した場合は、SQL Server によって完全なステートメントが作成されます。例については、この後の「例」を参照してください。
使用例
value パラメーターの複数の使用方法
UPDATE の場合:
1 つのパラメーターを使用する場合は、次の構文を使用して UPDATE ステートメントを送信できます。
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,…n]
注意
UPDATE <table name> を指定した場合、table パラメーターに指定した値は無視されます。
複数のパラメーターを使用する場合は、最初のパラメーターに次の形式の文字列を指定する必要があります。
[ SET ] <column name> = expression [,... n]
後続のパラメーターは次の形式で指定します。
<column name> = expression [,... n]
この場合、作成される UPDATE ステートメントの <table name> は、table パラメーターで指定した値またはその既定値になります。
INSERT の場合:
1 つのパラメーターを使用する場合は、次の構文を使用して INSERT ステートメントを送信できます。
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,... n] )
注意
INSERT <table name> を指定した場合、table パラメーターに指定した値は無視されます。
複数のパラメーターを使用する場合は、最初のパラメーターに次の形式の文字列を指定する必要があります。
[ VALUES ( ] <expression> [,... n]
後続のパラメーターは次の形式で指定します。
expression [,... n]
ただし、VALUES を指定した場合は例外として、最後の式の末尾に ")" を付ける必要があります。 この場合、作成される UPDATE ステートメントの <table name> は、table パラメーターで指定した値またはその既定値になります。
注意
1 つのパラメーターを名前付きパラメーターとして送信することもできます ("@VALUES" など)。その場合、他の名前付きパラメーターは使用できません。
関連項目
参照