動的カーソル (データベース エンジン)

動的カーソルは静的カーソルと対照的です。動的カーソルは、スクロールされるときに、結果セット内の行に対して行われたすべての変更を反映します。結果セット内の行のデータ値、順序、およびメンバシップは、フェッチを実行するたびに変化する可能性があります。UPDATE、INSERT、および DELETE ステートメントをどのユーザーが実行しても、その実行結果はすべてカーソルに表示されます。更新が SQLSetPos などの API 関数または Transact-SQL の WHERE CURRENT OF 句のいずれかを使用してカーソルによって行われた場合、それらの更新結果はすぐに表示されます。カーソルの外部から行った更新は、コミットされるまで表示されません。ただし、カーソルのトランザクション分離レベルが READ UNCOMMITTED に設定されている場合は、その限りではありません。

動的カーソルのプランでは、空間インデックスは使用されません。

注意

動的カーソルのクエリを実行するために選択した実行プランでヒープ スキャンが使用されていて、ページ ロックまたはテーブル ロックが獲得されることが条件としてある場合、行を削除するとページ全体の割り当てが解除される可能性があります。この場合、動的カーソルで位置を指定するために使用されるマーカーが無効になることがあり、その後のカーソルによるフェッチがエラー 16931 で失敗することがあります。解決策としては、テーブルにクラスタ化インデックスを作成する、異なるカーソルの種類を使用する、またはページレベルのロックやテーブルレベルのロックを防ぐことができるかどうかを評価することが挙げられます。

注意

SQL Server では、動的カーソルの作業テーブルの更新は常に実施されています。つまり、キー列が更新の一部として変更される場合でも、現在の行が更新されます。SQL Server 2000 では、現在の行は (配置されていないキーセット カーソルの場合と同様に) 削除するようにマークされても、(キーセット カーソルの場合とは異なり) 作業テーブルの末尾に挿入されませんでした。結果として、カーソルの更新では、行が検索されず、行が不足していることが報告されました。SQL Server では、カーソルの作業テーブルの同期が保たれます。また、行に新しいキーがあるので、更新によって行を検索できます。