DECLARE CURSOR(Transact-SQL)

  • 2017年3月14日
  • 読むのに13分
    • c
    • r
    • i
    • M
    • m
    • +6

適用対象: SQL Server(サポートされているすべてのバージョン) AzureSQLデータベース

スクロール動作や結果セットの構築に使用されるクエリなど、Transact-SQLサーバーカーソルの属性を定義します。カーソルが動作します。 DECLARE CURSORは、ISO標準に基づく構文と、一連のTransact-SQL拡張機能を使用した構文の両方を受け入れます。

Transact-SQL構文規則

構文

SQL Server 2014以前のTransact-SQL構文を表示するには、以前のバージョンのドキュメントを参照してください。 。

引数

cursor_name
定義されているTransact-SQLサーバーカーソルの名前です。 cursor_nameは、識別子の規則に準拠している必要があります。

INSENSITIVE
カーソルが使用するデータの一時的なコピーを作成するカーソルを定義します。カーソルへのすべての要求は、tempdbのこの一時テーブルから応答されます。したがって、ベーステーブルに加えられた変更は、このカーソルに対して行われたフェッチによって返されるデータには反映されず、このカーソルは変更を許可しません。 ISO構文が使用されている場合、INSENSITIVEが省略されると、(任意のユーザーによって)基になるテーブルに対して行われたコミットされた削除と更新が後続のフェッチに反映されます。

SCROLL
すべてのフェッチオプションを指定します(FIRSTLASTPRIORNEXTRELATIVEABSOLUTE)が利用可能です。 SCROLLがISO DECLARE CURSORで指定されていない場合、サポートされるフェッチオプションはNEXTのみです。 。 FAST_FORWARDも指定されている場合、SCROLLは指定できません。 SCROLLが指定されていない場合、フェッチオプションNEXTのみが使用可能になり、カーソルはFORWARD_ONLY

select_statement
カーソルの結果セットを定義する標準のSELECTステートメントです。キーワードFOR BROWSEおよびINTOは、カーソル宣言のselect_statement内では使用できません。

SQLServerは暗黙的にselect_statementの句が要求されたカーソルタイプの機能と競合する場合は、カーソルを別のタイプに移動します。

読み取り専用
このカーソルを介して行われた更新を防止します。 UPDATEまたはDELETEステートメントのWHERE CURRENT OF句でカーソルを参照することはできません。このオプションは、更新されるカーソルのデフォルト機能を上書きします。

cursor_name
Transact-SQLサーバーカーソルの名前が定義されています。 cursor_nameは、識別子の規則に準拠している必要があります。

LOCAL
カーソルのスコープが、カーソルが作成されたバッチ、ストアドプロシージャ、またはトリガーに対してローカルであることを指定します。カーソル名は、このスコープ内でのみ有効です。カーソルは、バッチ、ストアドプロシージャ、トリガーのローカルカーソル変数、またはストアドプロシージャのOUTPUTパラメータで参照できます。 OUTPUTパラメーターは、ローカルカーソルを呼び出し元のバッチ、ストアドプロシージャ、またはトリガーに戻すために使用されます。これにより、パラメーターをカーソル変数に割り当てて、ストアドプロシージャの後にカーソルを参照できます。終了します。カーソルがOUTPUTパラメータで戻されない限り、バッチ、ストアドプロシージャ、またはトリガーが終了すると、カーソルは暗黙的に割り当て解除されます。 OUTPUTパラメータで返される場合、カーソルを参照する最後の変数の割り当てが解除されるか、スコープ外になると、カーソルの割り当てが解除されます。

GLOBAL
カーソルのスコープが接続に対してグローバルであることを指定します。カーソル名は、接続によって実行される任意のストアドプロシージャまたはバッチで参照できます。カーソルは、切断時に暗黙的に割り当て解除されるだけです。

GLOBALまたはLOCALが指定されている場合、デフォルトはローカルカーソルデータベースオプションへのデフォルトの設定によって制御されます。

FORWARD_ONLY
カーソルが前方にのみ移動してからスクロールできることを指定します最初から最後の行。 FETCH NEXTがサポートされている唯一のフェッチオプションです。結果セットの行に影響を与える、現在のユーザーによって作成された(または他のユーザーによってコミットされた)すべての挿入、更新、および削除ステートメントは、行がフェッチされるときに表示されます。ただし、カーソルを後方にスクロールすることはできないため、行がフェッチされた後にデータベース内の行に加えられた変更は、カーソルからは見えません。順方向のみのカーソルはデフォルトで動的です。つまり、現在の行が処理されるときにすべての変更が検出されます。これにより、カーソルをすばやく開くことができ、結果セットに基になるテーブルに対して行われた更新を表示できます。順方向のみのカーソルは逆方向のスクロールをサポートしていませんが、アプリケーションはカーソルを閉じて再度開くことで結果セットの先頭に戻ることができます。FORWARD_ONLYが、KEYSET、またはDYNAMICキーワードの場合、カーソルは動的カーソルとして機能します。 FORWARD_ONLYSCROLLも指定されていない場合、キーワード除いて、FORWARD_ONLYがデフォルトになります。 div id = “faf4e501b3”> 、KEYSET、またはDYNAMICが指定されています。 STATICKEYSET、およびDYNAMICカーソルのデフォルトはSCROLL。 ODBCやADOなどのデータベースAPIとは異なり、FORWARD_ONLYSTATICKEYSETでサポートされています。およびDYNAMIC Transact-SQLカーソル。

STATIC
カーソルが最初に開かれたときの結果セットを常に表示するように指定し、カーソルで使用されるデータの一時コピー。カーソルへのすべての要求は、tempdbのこの一時テーブルから応答されます。したがって、ベーステーブルに対して行われた挿入、更新、および削除は、このカーソルに対して行われたフェッチによって返されるデータには反映されません。また、このカーソルは、カーソルが開かれた後に結果セットのメンバーシップ、順序、または値に対して行われた変更を検出しません。 。静的カーソルは、必須ではありませんが、独自の更新、削除、および挿入を検出する場合があります。たとえば、静的カーソルが行をフェッチし、別のアプリケーションがその行を更新するとします。アプリケーションが静的カーソルから行を再フェッチすると、他のアプリケーションによって変更が加えられても、表示される値は変更されません。すべてのタイプのスクロールがサポートされています。

KEYSET
カーソルを開いたときにカーソルの行のメンバーシップと順序が固定されるように指定します。行を一意に識別するキーのセットは、キーセットと呼ばれるtempdbのテーブルに組み込まれています。このカーソルは、変更を検出する機能において、静的カーソルと動的カーソルの間の機能を提供します。静的カーソルと同様に、結果セットのメンバーシップと順序の変更を常に検出するとは限りません。動的カーソルと同様に、結果セット内の行の値の変更を検出します。キーセット駆動型カーソルは、キーセットと呼ばれる一意の識別子(キー)のセットによって制御されます。キーは、結果セットの行を一意に識別する列のセットから作成されます。キーセットは、クエリステートメントによって返されるすべての行からのキー値のセットです。キーセット駆動型カーソルを使用すると、カーソルの行ごとにキーが作成および保存され、クライアントワークステーションまたはサーバーに保存されます。各行にアクセスすると、保存されているキーを使用して、データソースから現在のデータ値をフェッチします。キーセット駆動カーソルでは、キーセットが完全に入力されると、結果セットのメンバーシップがフリーズします。その後、メンバーシップに影響する追加または更新は、再度開くまで結果セットの一部にはなりません。ユーザーが結果セットをスクロールすると、データ値の変更(キーセットの所有者または他のプロセスによって行われた)が表示されます。

  • 行が削除された場合、その行をフェッチしようとすると、削除された行が結果セットのギャップとして表示されるため、-2の@@FETCH_STATUSが返されます。行のキーはキーセットに存在しますが、行は結果セットに存在しません。
  • カーソルの外側で(他のプロセスによって)作成された挿入は、カーソルを閉じて再度開いた場合にのみ表示されます。カーソルの内側から行われた挿入は、結果セットの最後に表示されます。
  • カーソルの外側からのキー値の更新は、古い行の削除とそれに続く新しい行の挿入に似ています。新しい値の行は表示されず、古い値の行をフェッチしようとすると、-2の@@FETCH_STATUSが返されます。 WHERE CURRENT OF句を指定してカーソルから更新を行うと、新しい値が表示されます。

クエリが一意のインデックスのない少なくとも1つのテーブルを参照している場合、キーセットカーソルは静的カーソルに変換されます。

DYNAMIC
に行われたすべてのデータ変更を反映するカーソルを定義します。変更がカーソルの内側から発生したか、カーソルの外側の他のユーザーによって発生したかに関係なく、カーソルをスクロールして新しいレコードをフェッチすると、結果セットの行が表示されます。したがって、すべてのユーザーによって行われたすべての挿入、更新、および削除ステートメントは、カーソルを通して表示されます。行のデータ値、順序、およびメンバーシップは、フェッチごとに変更できます。 ABSOLUTEフェッチオプションは、動的カーソルではサポートされていません。カーソルの外部で行われた更新は、コミットされるまで表示されません(カーソルトランザクション分離レベルがUNCOMMITTEDに設定されている場合を除く)。たとえば、動的カーソルが2つの行と別のアプリケーションをフェッチするとします。それらの行の1つを更新し、もう1つを削除します。次にダイナミックカーソルがそれらの行をフェッチすると、削除された行は見つかりませんが、更新された行の新しい値が表示されます。

FAST_FORWARD
FORWARD_ONLY、パフォーマンスの最適化が有効になっているREAD_ONLYカーソル。 FAST_FORWARDも指定されている場合、SCROLLまたはFOR_UPDATEは指定できません。このタイプのカーソルでは、カーソル内からのデータ変更は許可されません。

FAST_FORWARDFORWARD_ONLYは同じDECLARE CURSORステートメントで使用できます。

READ_ONLY
このカーソルを介して行われた更新を防止します。 UPDATEまたはDELETEステートメントのWHERE CURRENT OF句でカーソルを参照することはできません。このオプションは、更新されるカーソルのデフォルト機能をオーバーライドします。

SCROLL_LOCKS
カーソルを介して行われた位置付けされた更新または削除が確実に成功することを指定します。 SQL Serverは、カーソルに読み込まれるときに行をロックして、後で変更できるようにします。 SCROLL_LOCKSは、FAST_FORWARDまたはSTATICも指定されている場合は指定できません。

OPTIMISTIC
行がカーソルに読み込まれてから更新されている場合、カーソルを介して行われた位置付けされた更新または削除が成功しないことを指定します。 SQL Serverは、カーソルに読み込まれるときに行をロックしません。代わりに、タイムスタンプ列の値の比較、またはテーブルにタイムスタンプ列がない場合はチェックサム値を使用して、カーソルに読み込まれた後に行が変更されたかどうかを判断します。行が変更された場合、試行された位置の更新または削除は失敗します。 OPTIMISTICは、FAST_FORWARDも指定されている場合は指定できません。

TYPE_WARNING
警告メッセージの送信を指定しますカーソルが要求されたタイプから別のタイプに暗黙的に変換されるときにクライアントに送信されます。

select_statement
カーソルの結果セットを定義する標準のSELECTステートメントです。キーワードCOMPUTECOMPUTE BYFOR BROWSE、およびINTOはカーソル宣言のselect_statement内では許可されていません。

カーソル宣言内でクエリヒントを使用できます。ただし、FOR UPDATE OF句も使用する場合は、FOR UPDATE OFの後にOPTION (<query_hint>)を指定してください。

select_statementの句が要求されたカーソルタイプの機能と競合する場合、SQLServerは暗黙的にカーソルを別のタイプに変換します。詳細については、暗黙的なカーソル変換を参照してください。

備考

DECLARE CURSORは、Transact-SQLサーバーカーソルの属性を定義します。スクロール動作と、カーソルが動作する結果セットを構築するために使用されるクエリ。 OPENステートメントは結果セットにデータを入力し、FETCHは結果セットから行を返します。 CLOSEステートメントは、カーソルに関連付けられている現在の結果セットを解放します。 DEALLOCATEステートメントはカーソルによって使用されるリソースを解放します。

DECLARE CURSORステートメントの最初の形式はISOを使用しますカーソルの動作を宣言するための構文。 DECLARE CURSORの2番目の形式は、Transact-SQL拡張機能を使用して、ODBCまたはADOのデータベースAPIカーソル関数で使用されるのと同じカーソルタイプを使用してカーソルを定義できるようにします。

2つの形式を混在させることはできません。 CURSORキーワードの前にSCROLLまたはINSENSITIVEキーワードを指定した場合、 CURSORキーワードとFOR <select_statement>キーワードの間のキーワード。 CURSORキーワードとFOR <select_statement>キーワードの間にキーワードを指定した場合、SCROLLまたはCURSORキーワードの前のINSENSITIVE

Transact-SQL構文を使用するDECLARE CURSORREAD_ONLYが指定されていない場合、OPTIMISTICまたはSCROLL_LOCKSの場合、デフォルトは次のとおりです。

  • SELECTステートメントは更新(不十分なアクセス許可、更新をサポートしないリモートテーブルへのアクセスなど)をサポートしていません。カーソルはREAD_ONLYです。

  • STATICおよびFAST_FORWARDカーソルのデフォルトはREAD_ONLYです。

  • DYNAMICおよびKEYSETカーソルのデフォルトはOPTIMISTIC

カーソル名は、他のTransact-SQLステートメントでのみ参照できます。データベースAPI関数からは参照できません。たとえば、カーソルを宣言した後は、カーソル名をOLE DB、ODBC、またはADOの関数またはメソッドから参照することはできません。 APIのフェッチ関数またはメソッドを使用してカーソル行をフェッチすることはできません。行は、Transact-SQLFETCHステートメントによってのみフェッチできます。

カーソルが宣言された後、これらのシステムストアドプロシージャを使用して、カーソルの特性を判別できます。

システムストアドプロシージャ 説明
sp_cursor_list 接続で現在表示されているカーソルとその属性のリストを返します。
sp_describe_cursor カーソルが順方向専用かスクロールカーソルかなど、カーソルの属性を記述します。
sp_describe_cursor_columns カーソル結果セットの列の属性を記述します。
sp_describe_cursor_tables アクセスされるベーステーブルを記述します。カーソルで。

変数は、宣言するselect_statementの一部として使用できます。カーソル。カーソルが宣言された後、カーソル変数値は変更されません。

権限

DECLARE CURSORの権限は、デフォルトで カーソルで使用されるビュー、テーブル、および列に対する権限。

制限と制限

テーブルでカーソルまたはトリガーを使用することはできません。クラスタ化された列ストアインデックス。この制限は、クラスター化されていない列ストアインデックスには適用されません。非クラスター化列ストアインデックスを持つテーブルでカーソルとトリガーを使用できます。

A。単純なカーソルと構文の使用

このカーソルを開いたときに生成される結果セットには、テーブル内のすべての行とすべての列が含まれます。このカーソルは更新可能であり、すべての更新と削除は、このカーソルに対して行われたフェッチで表されます。 FETCH NEXTは、SCROLLオプションが指定されていないため、使用可能な唯一のフェッチです。

B。ネストされたカーソルを使用してレポート出力を生成する

次の例は、カーソルをネストして複雑なレポートを生成する方法を示しています。内側のカーソルはベンダーごとに宣言されています。

関連項目

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です