カーソル用の SQL ステートメントの作成
SQL Server Native Client ODBC ドライバは、ODBC 仕様に定義されたカーソル機能をサーバー カーソルを使用して実装します。ODBC アプリケーションではカーソルの動作を制御するために、さまざまなステートメント属性を設定する SQLSetStmtAttr が使用されます。次に、属性とその既定値を示します。
属性 |
既定値 |
---|---|
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 ステートメントも該当します。
キーワード
キーワード COMPUTE、COMPUTE BY、FOR BROWSE、または INTO を伴う SELECT ステートメント。
SQL Server で、上記の条件のいずれかに該当する SQL ステートメントをサーバー カーソルを使用して実行した場合、サーバー カーソルは暗黙的に既定の結果セットに変換されます。SQLExecDirect または SQLExecute が SQL_SUCCESS_WITH_INFO を返した後では、カーソルの属性が既定の設定に戻ります。
上記の分類に該当しない SQL ステートメントは、ステートメント属性の設定がどのようであっても実行できます。既定の結果セット、サーバー カーソルを問わず、どちらも正常に機能します。
エラー
SQL Server 7.0 以降のバージョンで複数の結果セットが生成されるステートメントを実行すると、SQL_SUCCESS_WITH INFO および次のメッセージが生成されます。
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.
サーバー カーソルを使用しているときに、COMPUTE 句を含んだ SELECT ステートメントを実行すると、次のエラーが発生します。
SqlState: 42000
pfNative: 16907
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
'COMPUTE' is not allowed in cursor statements.
ODBC アプリケーションで上記のエラーが発生した場合、カーソルのすべてのステートメント属性を既定値に戻してからステートメントを実行する必要があります。