sp_cursor (Transact-SQL)
適用対象: SQL Server
配置された更新を要求します。 このプロシージャは、カーソルのフェッチ バッファー内にある 1 つ以上の行に対して操作を実行します。 sp_cursor
は、表形式データ ストリーム (TDS) パケットで ID = 1
を指定することによって呼び出されます。
構文
sp_cursor cursor , optype , rownum , table
[ , value [ ...n ] ]
[ ; ]
引数
cursor
カーソル ハンドルです。 cursor パラメーターは int であり、NULL
することはできません。 このパラメーターは、データベース エンジンによって生成され、sp_cursoropen
プロシージャによって返されるhandle
値です。
optype
カーソルが実行する操作を指定する必須パラメーター。 optype パラメーターには、次のいずれかの値が必要です。
Value | 名前 | 説明 |
---|---|---|
0X0001 |
UPDATE |
フェッチ バッファー内の 1 つ以上の行を更新するために使用されます。 rownum で指定された行が再アクセスされ、更新されます。 |
0x0002 |
DELETE |
フェッチ バッファー内の 1 つ以上の行を削除するために使用されます。 rownum で指定された行が再アクセスされ、削除されます。 |
0X0004 |
INSERT |
INSERT ステートメントを作成せずにデータを挿入します。 |
0X0008 |
REFRESH |
基になるテーブルからバッファーを補充するために使用され、オプティミスティック コンカレンシー制御が原因で更新または削除が失敗した場合、または UPDATE 後に行を更新するために使用できます。 |
0X10 |
LOCK |
指定した行を含むページで更新ロック (U) を取得します。 このロックは共有ロック (S) と互換性がありますが、排他ロック (X) やその他の更新ロックには対応していません。 短期間のロックを実装する場合に使用できます。 |
0X20 |
SETPOSITION |
プログラムが後続の DELETE または UPDATE ステートメントを発行する場合にのみ使用されます。 |
0X40 |
ABSOLUTE |
UPDATE またはDELETE でのみ使用できます。 ABSOLUTE は KEYSET カーソルでのみ使用され ( DYNAMIC カーソルの場合は無視されます)、 STATIC カーソルは更新できません。注: フェッチされていないキーセット内の行に ABSOLUTE が指定されている場合、操作はコンカレンシー チェックに失敗する可能性があり、返される結果は保証されません。 |
rownum
カーソルが操作、更新、または削除するフェッチ バッファー内の行を指定します。 このパラメーターは、 RELATIVE
、 NEXT
、または PREVIOUS
フェッチ操作の開始点にも、 sp_cursor
を使用して実行される更新または削除にも影響しません。
rownum は、 int 入力値を呼び出す必須のパラメーターです。
1
フェッチ バッファーの最初の行を示します。
2, 3, 4, ...n
2 行目、3 行目、4 行目などを示します。
0
フェッチ バッファー内のすべての行を示します。
このパラメーターは、 UPDATE
、 DELETE
、 REFRESH
、または LOCK
optype 値でのみ使用できます。
テーブル
optypeが適用されるテーブル名は、カーソル定義に結合が含まれている場合、またはあいまいな列名が value パラメーターによって返される場合に適用されます。 特定のテーブルが指定されていない場合、既定値は FROM
句の最初のテーブルです。 table パラメーターは省略可能であり、文字列入力値が必要です。 文字列は、任意の文字または Unicode データ型、または複数部構成のテーブル名として指定できます。
value
値を挿入または更新する場合に使用します。 value文字列パラメーターは、UPDATE
とINSERT
optype値でのみ使用されます。 文字列は、任意の文字または Unicode データ型として指定できます。
valueのパラメーター名は、ユーザーが割り当てることができます。
リターン コードの値
0
(成功) または 1
(失敗)。
解説
optype パラメーター
UPDATE
、DELETE
、REFRESH
、またはLOCK
;、またはUPDATE
またはDELETE
のABSOLUTE
を持つSETPOSITION
の組み合わせを除き、optype値は相互に排他的です。
UPDATE
値のSET
句は、value パラメーターから作成されます。
INSERT <optype>
値を使用する利点の 1 つは、文字以外のデータを挿入用の文字形式に変換しないようにできることです。 値は、 UPDATE
と同じ方法で指定されます。 必要な列が含まれていない場合、 INSERT
は失敗します。
SETPOSITION
値は、RELATIVE
、NEXT
、またはPREVIOUS
フェッチ操作の開始点には影響しません。また、sp_cursor
インターフェイスを使用して実行される更新や削除は行われません。 フェッチ バッファー内の行を指定しない数値を指定すると、位置が1
に設定され、エラーは返されません。SETPOSITION
が実行されると、その位置は、次のsp_cursorfetch
操作、T-SQLFETCH
操作、または同じカーソルを介した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 に指定された値は無視されます。
Note
ビューに関連して、ビューに参加しているテーブルは 1 つだけ変更される可能性があります。 value パラメーターの列名はビュー内の列名を反映している必要がありますが、テーブル名は基になるベース テーブルの名前にすることができます (この場合、sp_cursor
はビュー名に置き換えます)。
value パラメーター
引数セクションで前述したように、 value を使用する規則には、次の 2 つの方法があります。
名前付き value パラメーターの select-list 内の列の名前の前に付加
@
名前を使用できます。 この代替手段の 1 つの利点は、データ変換が必要ない可能性があるということです。パラメーターを使用して、完全な
UPDATE
またはINSERT
ステートメントを送信するか、複数のパラメーターを使用してUPDATE
またはINSERT
ステートメントの一部を送信します。データベース エンジンは完全なステートメントに組み込まれます。 例については、この記事の後半の「 Examples 」セクションを参照してください。
例
代替値パラメーターの使用
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 ] )
後続のパラメーターは、VALUES
が指定された場合を除き、expression [ , ...n ]
の形式である必要があります。その場合は、最後の式の後に末尾の)
が必要です。 この場合、構築されたUPDATE
ステートメント内の<table_name>
は、table パラメーターによって指定されるか既定値になります。
Note
@values
など、1 つのパラメーターを名前付きパラメーターとして送信できます。 この場合、他の名前付きパラメーターは使用できません。