カーソル用の SQL ステートメントの作成
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server Native Client ODBC ドライバーは、サーバー カーソルを使用して、ODBC 仕様で定義されているカーソル機能を実装します。 ODBC アプリケーションは、SQLSetStmtAttr を使用してさまざまなステートメント属性を設定することで、カーソルの動作を制御します。 次に、属性とその既定値を示します。
Attribute | 既定値 |
---|---|
SQL_ATTR_CONCURRENCY | SQL_CONCUR_READ_ONLY |
SQL_ATTR_CURSOR_TYPE | SQL_CURSOR_FORWARD_ONLY |
SQL_ATTR_CURSOR_SCROLLABLE | SQL_NONSCROLLABLE |
SQL_ATTR_CURSOR_SENSITIVITY | SQL_UNSPECIFIED |
SQL_ATTR_ROW_ARRAY_SIZE | 1 |
SQL ステートメントの実行時にこれらのオプションが既定値に設定されている場合、SQL Server Native Client ODBC ドライバーはサーバー カーソルを使用して結果セットを実装しません。代わりに、既定の結果セットが使用されます。 SQL ステートメントの実行時にこれらのオプションのいずれかが既定値から変更された場合、SQL Server Native Client ODBC ドライバーはサーバー カーソルを使用して結果セットを実装しようとします。
既定の結果セットでは、すべての Transact-SQL ステートメントがサポートされます。 既定の結果セットを使用するときに実行できる SQL ステートメントの種類に制限はありません。
サーバー カーソルはすべての Transact-SQL ステートメントをサポートしているわけではありません。 複数の結果セットを生成する SQL ステートメントはサポートされません。
次に示す種類のステートメントは、サーバー カーソルではサポートされません。
バッチ
2 つ以上の個別の SQL SELECT ステートメントから構成される SQL ステートメント。次に例を示します。
SELECT * FROM Authors; SELECT * FROM Titles
複数の SELECT ステートメントを含むストアド プロシージャ
複数の SELECT ステートメントを含むストアド プロシージャを実行する SQL ステートメント。 パラメーターまたは変数を設定する SELECT ステートメントも該当します。
キーワード
キーワード FOR BROWSE または INTO を伴う SELECT ステートメント。
SQL Server では、これらの条件のいずれかに一致する SQL ステートメントがサーバー カーソルを使用して実行された場合、サーバー カーソルは暗黙的に既定の結果セットに変換されます。 SQLExecDirect または SQLExecute がSQL_SUCCESS_WITH_INFOを返した後、カーソル属性は既定の設定に戻されます。
上記の分類に該当しない SQL ステートメントは、ステートメント属性の設定がどのようであっても実行できます。既定の結果セット、サーバー カーソルを問わず、どちらも正常に機能します。
エラー
SQL Server 7.0 以降では、複数の結果セットを生成するステートメントを実行しようとすると、INFO と次のメッセージSQL_SUCCESS_WITH生成されます。
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
このメッセージを受信する ODBC アプリケーションは、SQLGetStmtAttr を呼び出して現在のカーソル設定を決定できます。
サーバー カーソルを使用しているときに、複数の SELECT ステートメントから構成されるプロシージャを実行すると、次のエラーが発生します。
SqlState: 42000
pfNative: 16937
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
A server cursor is not allowed on a stored procedure
with more than one SELECT statement in it. Use a
default result set or client cursor.
サーバー カーソルを使用しているときに、複数の SELECT ステートメントから構成されるバッチを実行すると、次のエラーが発生します。
SqlState: 42000
pfNative: 16938
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
sp_cursoropen. The statement parameter can only
be a single SELECT statement or a single stored
procedure.
ODBC アプリケーションで上記のエラーが発生した場合、カーソルのすべてのステートメント属性を既定値に戻してからステートメントを実行する必要があります。