sp_cursor (Transact-SQL)

適用対象: SQL Server

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

Transact-SQL 構文表記規則

構文

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でのみ使用できます。 ABSOLUTEKEYSET カーソルでのみ使用され ( DYNAMIC カーソルの場合は無視されます)、 STATIC カーソルは更新できません。

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

rownum

カーソルが操作、更新、または削除するフェッチ バッファー内の行を指定します。 このパラメーターは、 RELATIVENEXT、または PREVIOUS フェッチ操作の開始点にも、 sp_cursorを使用して実行される更新または削除にも影響しません。

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

  • 1

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

  • 2, 3, 4, ...n

    2 行目、3 行目、4 行目などを示します。

  • 0

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

このパラメーターは、 UPDATEDELETEREFRESH、または LOCK optype 値でのみ使用できます。

テーブル

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

value

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

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

リターン コードの値

0 (成功) または 1 (失敗)。

解説

optype パラメーター

UPDATEDELETEREFRESH、またはLOCK;、またはUPDATEまたはDELETEABSOLUTEを持つSETPOSITIONの組み合わせを除き、optype値は相互に排他的です。

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

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

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

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

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

rownum パラメーター

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

table パラメーター

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

Note

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

value パラメーター

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

  1. 名前付き value パラメーターの select-list 内の列の名前の前に付加@名前を使用できます。 この代替手段の 1 つの利点は、データ変換が必要ない可能性があるということです。

  2. パラメーターを使用して、完全な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 つのパラメーターを名前付きパラメーターとして送信できます。 この場合、他の名前付きパラメーターは使用できません。