行セットと SQL Server カーソル
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server では、2 種類の方法でコンシューマーに結果セットが返されます。
既定の結果セット。これには次の特徴があります。
オーバーヘッドを最小限に抑えます。
最高のパフォーマンスでデータをフェッチします。
既定の順方向専用かつ読み取り専用のカーソル機能だけをサポートします。
一度に 1 行をコンシューマーに返します。
1 つの接続でサポートされるアクティブ ステートメントは一度に 1 つだけです。
ステートメントの実行後は、コンシューマーがすべての結果を取得するまで、またはステートメントが取り消されるまで、その接続で別のステートメントを実行することはできません。
すべての Transact-SQL ステートメントをサポートします。
サーバー カーソル。これには、次の特徴があります。
すべてのカーソル機能をサポートします。
コンシューマーに行のブロックを返すことができます。
1 つの接続で複数のアクティブ ステートメントをサポートします。
カーソル機能とパフォーマンスのバランスが取れています。
カーソル機能をサポートすると、既定の結果セットに比べてパフォーマンスが低下する場合があります。 コンシューマーはカーソル機能を使用して比較的小さな行のセットを取得することで、この欠点を補うことができます。
複数の結果セットを返す Transact-SQL ステートメントはサポートしません。
コンシューマーは、特定の行セット プロパティを設定することで、行セットでのカーソルの動作を変更できます。 コンシューマーでそれらの行セット プロパティがまったく設定されないか、またはすべてのプロパティが既定値に設定された場合、OLE DB Driver for SQL Server では既定の結果セットを使用して行セットが実装されます。 プロパティのいずれか 1 つでも既定値以外の値に設定されると、OLE DB Driver for SQL Server では、サーバー カーソルを使用して行セットが実装されます。
次の行セット プロパティによって、SQL Server カーソルを使用することが OLE DB Driver for SQL Server に指示されます。 プロパティによっては、他のプロパティと組み合わせて使用できるものもあります。 たとえば、DBPROP_IRowsetScroll プロパティと DBPROP_IRowsetChange プロパティを備えた行セットは、即時更新動作を表すブックマーク行セットになります。 同時に指定できないプロパティもあります。 たとえば、DBPROP_OTHERINSERT を備えた行セットにはブックマークを含めることはできません。
プロパティ ID | 値 | 行セットの動作 |
---|---|---|
DBPROP_SERVERCURSOR | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットは順次処理され、順方向のスクロールとフェッチのみがサポートされます。 相対行位置指定がサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 |
DBPROP_CANSCROLLBACKWARDS または DBPROP_CANFETCHBACKWARDS | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットでは、両方向へのスクロールとフェッチがサポートされます。 相対行位置指定がサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 |
DBPROP_BOOKMARKS または DBPROP_LITERALBOOKMARKS | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットは順次処理され、順方向のスクロールとフェッチのみがサポートされます。 相対行位置指定がサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 |
DBPROP_OWNUPDATEDELETE、DBPROP_OWNINSERT、または DBPROP_OTHERUPDATEDELETE | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットでは、両方向へのスクロールとフェッチがサポートされます。 相対行位置指定がサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 |
DBPROP_OTHERINSERT | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットでは、両方向へのスクロールとフェッチがサポートされます。 相対行位置指定がサポートされます。 参照先の列にインデックスが存在する場合は、コマンド テキストに ORDER BY 句を指定できます。 行セットにブックマークが含まれる場合は、DBPROP_OTHERINSERT に VARIANT_TRUE を指定できません。 この表示設定プロパティとブックマークを指定して行セットを作成しようとすると、エラーが発生します。 |
DBPROP_IRowsetLocate または DBPROP_IRowsetScroll | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットでは、両方向へのスクロールとフェッチがサポートされます。 IRowsetLocate インターフェイスを使用したブックマークと絶対位置指定が、行セットでサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 DBPROP_IRowsetLocate と DBPROP_IRowsetScroll は、行セット内にブックマークを要求します。 ブックマークを含み、DBPROP_OTHERINSERT に VARIANT_TRUE を設定した行セットを作成しようとすると、エラーが発生します。 |
DBPROP_IRowsetChange または DBPROP_IRowsetUpdate | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できます。 行セットは順次処理され、順方向のスクロールとフェッチのみがサポートされます。 相対行位置指定がサポートされます。 更新可能なカーソルをサポートするすべてのコマンドでは、これらのインターフェイスがサポートされます。 |
DBPROP_IRowsetLocate または DBPROP_IRowsetScroll、および DBPROP_IRowsetChange または DBPROP_IRowsetUpdate | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できます。 行セットでは、両方向へのスクロールとフェッチがサポートされます。 IRowsetLocate を使用したブックマークと絶対位置指定が、行セットでサポートされます。 コマンド テキストに ORDER BY 句を指定できます。 |
DBPROP_IMMOBILEROWS | VARIANT_FALSE | 行セットを使用して SQL Server データを更新できません。 行セットでは、順方向のスクロールしかサポートされません。 相対行位置指定がサポートされます。 参照先の列にインデックスが存在する場合は、コマンド テキストに ORDER BY 句を指定できます。 DBPROP_IMMOBILEROWS は、別のセッションのコマンドや別のユーザーから挿入された SQL Server 行を表示できる行セットだけで使用できます。 DBPROP_OTHERINSERT に VARIANT_TRUE を設定できない行セットで、プロパティに VARIANT_FALSE が設定されている行セットを開こうとすると、エラーが発生します。 |
DBPROP_REMOVEDELETED | VARIANT_TRUE | 行セットを使用して SQL Server データを更新できません。 行セットでは、順方向のスクロールしかサポートされません。 相対行位置指定がサポートされます。 別のプロパティで制約されている場合を除いて、コマンド テキストに ORDER BY 句を指定できます。 |
サーバー カーソルでサポートされる OLE DB Driver for SQL Server 行セットは、IOpenRowset::OpenRowset メソッドを使用して、SQL Server ベース テーブルまたはビュー上に簡単に作成できます。 テーブルやビューを名前で指定し、必要な行セット プロパティのセットを rgPropertySets パラメーターで渡します。
コンシューマーが、サーバー カーソルでサポートされる行セットを要求すると、行セットを作成するコマンド テキストが制限されます。 具体的には、1 つの行セットを結果として返す 1 つの SELECT ステートメント、または 1 つの行セットを結果として返す 1 つの SELECT ステートメントを実装するストアド プロシージャに制限されます。
次の 2 つの表に、各種 OLE DB プロパティとカーソル モデルのマッピングを示します。 また、特定の種類のカーソル モデルを使用するために設定する必要がある行セット プロパティも示します。
表の各欄には、特定のカーソル モデル向けの行セット プロパティ値を示しています。 このトピックの前半で示した行セット プロパティのデータ型はすべて VT_BOOL で、既定値は VARIANT_FALSE です。 表では、次の記号を使用しています。
F = 既定値 (VARIANT_FALSE)
T = VARIANT_TRUE
- = VARIANT_TRUE または VARIANT_FALSE
特定の種類のカーソル モデルを使用するには、カーソル モデルに対応する列を探し、列の値が "T" であるすべての行セット プロパティを見つけます。 これらの行セット プロパティに VARIANT_TRUE を設定すると、その特定のカーソル モデルを使用できます。 値が "-" の行セット プロパティには、VARIANT_TRUE と VARIANT_FALSE のどちらも設定できます。
行セット プロパティ/カーソル モデル | Default 結果 set (RO) |
速い 順方向 のみ (RO) |
静的 (RO) |
Keyset ドリブン (RO) |
---|---|---|---|---|
DBPROP_SERVERCURSOR | F | T | T | T |
DBPROP_DEFERRED | F | F | - | - |
DBPROP_IrowsetChange | F | F | F | F |
DBPROP_IrowsetLocate | F | F | - | - |
DBPROP_IrowsetScroll | F | F | - | - |
DBPROP_IrowsetUpdate | F | F | F | F |
DBPROP_BOOKMARKS | F | F | - | - |
DBPROP_CANFETCHBACKWARDS | F | F | - | - |
DBPROP_CANSRCOLLBACKWARDS | F | F | - | - |
DBPROP_CANHOLDROWS | F | F | - | - |
DBPROP_LITERALBOOKMARKS | F | F | - | - |
DBPROP_OTHERINSERT | F | T | F | F |
DBPROP_OTHERUPDATEDELETE | F | T | F | T |
DBPROP_OWNINSERT | F | T | F | T |
DBPROP_OWNUPDATEDELETE | F | T | F | T |
DBPROP_QUICKSTART | F | F | - | - |
DBPROP_REMOVEDELETED | F | F | F | - |
DBPROP_IrowsetResynch | F | F | F | - |
DBPROP_CHANGEINSERTEDROWS | F | F | F | F |
DBPROP_SERVERDATAONINSERT | F | F | F | - |
DBPROP_UNIQUEROWS | - | F | F | F |
DBPROP_IMMOBILEROWS | - | - | - | T |
行セット プロパティ/カーソル モデル | 動的 (RO) | キー セット (R/W) | 動的 (R/W) |
---|---|---|---|
DBPROP_SERVERCURSOR | T | T | T |
DBPROP_DEFERRED | - | - | - |
DBPROP_IrowsetChange | F | - | - |
DBPROP_IrowsetLocate | F | - | F |
DBPROP_IrowsetScroll | F | - | F |
DBPROP_IrowsetUpdate | F | - | - |
DBPROP_BOOKMARKS | F | - | F |
DBPROP_CANFETCHBACKWARDS | - | - | - |
DBPROP_CANSRCOLLBACKWARDS | - | - | - |
DBPROP_CANHOLDROWS | F | - | F |
DBPROP_LITERALBOOKMARKS | F | - | F |
DBPROP_OTHERINSERT | T | F | T |
DBPROP_OTHERUPDATEDELETE | T | T | T |
DBPROP_OWNINSERT | T | T | T |
DBPROP_OWNUPDATEDELETE | T | T | T |
DBPROP_QUICKSTART | - | - | - |
DBPROP_REMOVEDELETED | T | - | T |
DBPROP_IrowsetResynch | - | - | - |
DBPROP_CHANGEINSERTEDROWS | F | - | F |
DBPROP_SERVERDATAONINSERT | F | - | F |
DBPROP_UNIQUEROWS | F | F | F |
DBPROP_IMMOBILEROWS | F | T | F |
行セット プロパティの特定のセットに対して選択されるカーソル モデルは、次のようにして決まります。
行セット プロパティの指定されたコレクションから、上の表に示したプロパティのサブセットを取得します。 これらのプロパティを、各行セット プロパティのフラグ値 (必須 (T、F) または省略可能 (-)) に応じて、2 つのサブグループに分けます。 カーソル モデルごとに、最初のテーブルから開始し、左から右へ移動します。 2 つのサブグループ内のプロパティの値を、その列の対応するプロパティの値と比較します。 必須プロパティに不一致がなく、かつオプション プロパティの不一致が最も少ないカーソル モデルが選択されます。 複数のカーソル モデルが該当する場合は、一番左側のモデルが選択されます。
SQL Server カーソル ブロックのサイズ
SQL Server カーソルで OLE DB Driver for SQL Server 行セットがサポートされる場合、IRowset::GetNextRows メソッドまたは IRowsetLocate::GetRowsAt メソッドの行ハンドル配列パラメーター内の要素数によって、カーソル ブロックのサイズが決まります。 配列内のハンドルで指定される行が、カーソル ブロックのメンバーです。
ブックマークをサポートしている行セットの場合、IRowsetLocate::GetRowsByBookmark メソッドを使用して取得される行ハンドルにより、カーソル ブロックのメンバーが定義されます。
行セットの作成や SQL Server カーソル ブロックの形成にどのメソッドを使用したかにかかわらず、行セットの次の行をフェッチするメソッドが実行されるまで、カーソル ブロックはアクティブです。