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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQL Server Native Client ODBC ドライバーは、サーバー カーソルを使用して、ODBC 仕様で定義されているカーソル機能を実装します。 ODBC アプリケーションは、 SQLSetStmtAttr を使用してさまざまなステートメント属性を設定することで、カーソルの動作を制御します。 次に、属性とその既定値を示します。

属性 Default
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 ステートメントも該当します。

  • Keywords

    キーワード 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 アプリケーションで上記のエラーが発生した場合、カーソルのすべてのステートメント属性を既定値に戻してからステートメントを実行する必要があります。

参照

クエリの実行 (ODBC)