カーソル用の SQL ステートメントの作成

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 アプリケーションで上記のエラーが発生した場合、カーソルのすべてのステートメント属性を既定値に戻してからステートメントを実行する必要があります。