結果の処理 (ODBC)

アプリケーションで SQL ステートメントが実行されると、SQL Server では結果として生成されるすべてのデータを 1 つ以上の結果セットとして返します。結果セットとは、クエリの条件に一致する行と列の集まりです。SELECT ステートメント、カタログ関数、および一部のストアド プロシージャでは、アプリケーションで使用できる結果セットが表形式で生成されます。実行される SQL ステートメントがストアド プロシージャ、複数のコマンドを含むバッチ、または COMPUTE や COMPUTE BY などのキーワードを含む SELECT ステートメントの場合、処理対象の結果セットが複数生成されます。

ODBC カタログ関数では、データを取得することもできます。たとえば、SQLColumns は、データ ソース内の列に関するデータを取得します。これらの結果セットには、0 行以上の行を含めることができます。

GRANT や REVOKE など、結果セットが返されない SQL ステートメントもあります。このようなステートメントの場合、通常、SQLExecuteSQLExecDirect からリターン コードだけが返され、ステートメントが正常に完了したことを示します。

INSERT ステートメント、UPDATE ステートメント、および DELETE ステートメントからは、変更によって処理された行数だけを含む結果セットが返されます。アプリケーションから SQLRowCount を呼び出すと、この行数を使用できるようになります。ODBC 3.x アプリケーションでは、SQLRowCount を呼び出して結果セットを取得するか、SQLMoreResults を呼び出して結果セットをキャンセルする必要があります。アプリケーションで複数の INSERT ステートメント、UPDATE ステートメント、または DELETE ステートメントを含むバッチまたはストアド プロシージャを実行するときは、SQLRowCount を使用して各変更ステートメントからの結果セットを処理するか、SQLMoreResults を使用してキャンセルする必要があります。バッチやストアド プロシージャに SET NOCOUNT ON ステートメントを含めることで、これらの数をキャンセルできます。

Transact-SQL には、NOCOUNT ステートメントが含まれています。NOCOUNT オプションを有効にすると、SQL Server からステートメントで処理された行数が返されず、SQLRowCount から 0 が返されます。SQL Server Native Client ODBC ドライバ バージョンでは、NOCOUNT オプションが有効か無効かを報告するために、ドライバ固有の SQLGetStmtAttr オプションとして SQL_SOPT_SS_NOCOUNT_STATUS が導入されました。SQLRowCount から 0 が返されるときは、必ず、アプリケーションで SQL_SOPT_SS_NOCOUNT_STATUS をテストする必要があります。SQL_NC_ON が返される場合、SQLRowCount から返される値が 0 であると、SQL Server から行数が返されなかったことを示します。SQL_NC_OFF が返される場合、NOCOUNT が無効になっており、SQLRowCount から返される値が 0 であると、ステートメントで処理された行がなかったことを示します。SQL_SOPT_SS_NOCOUNT_STATUS が SQL_NC_OFF のときは、アプリケーションでは、SQLRowCount の値を表示しないでください。大きなバッチやストアド プロシージャには、複数の SET NOCOUNT ステートメントが含まれていることがあるので、プログラマは SQL_SOPT_SS_NOCOUNT_STATUS が一定であると想定することはできません。SQLRowCount から 0 が返されるたびにこのオプションをテストする必要があります。

他のいくつかの Transact-SQL ステートメントは、結果セットではなく、メッセージにデータを含めて返します。SQL Server Native Client ODBC ドライバはこのようなメッセージを受け取ると、SQL_SUCCESS_WITH_INFO を返して、情報メッセージを使用できることをアプリケーションに通知します。その後、アプリケーションでは SQLGetDiagRec を呼び出してこれらのメッセージを取得できます。このように機能する Transact-SQL ステートメントを次に示します。

  • DBCC

  • SET SHOWPLAN (以前のバージョンの SQL Server で使用可能)

  • SET STATISTICS

  • PRINT

  • RAISERROR

SQL Server Native Client ODBC ドライバでは、RAISERROR で重大度が 11 以上の SQL_ERROR が返されます。RAISERROR の重大度が 19 以上の場合は、接続も削除されます。

アプリケーションでは、SQL ステートメントから返される結果セットを処理するために次の処理を行います。

  • 結果セットの特性を判断します。

  • プログラム変数に列をバインドします。

  • 1 つの値、値の行全体、または値の複数の行を取得します。

  • さらに結果セットが存在するかどうかを確認するテストを行い、存在する場合は、新しい結果セットの特性を判断する処理まで戻って、それ以降をループ処理します。

データ ソースから行を取得し、取得した行をアプリケーションに返す処理をフェッチと呼びます。

COMPUTE と COMPUTE BY の結果セットの取得

COMPUTE BY 句は結果セット内で小計を生成し、COMPUTE 句は結果セットの最後に総計を生成します。SQL Server Native Client ODBC ドライバでは、SELECT ステートメントごとに複数の結果セットを生成することで、これらの総計と小計を呼び出し元のアプリケーションに提供します。

次の例では、COMPUTE BY を使用して小計を生成し、COMPUTE を使用して総計を生成しています。

SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
  AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

上記のステートメントでは、書籍の種類ごとに平均価格と前払い金の合計の小計を計算してから、価格データと前払い金データの両方の最終的な総計を計算します。ドライバによって生成される最初の結果セットは、最初の種類に該当する書籍を基にした行から構成されます。次に、この最初の書籍のセットの AVG(price) と SUM(advance) の 2 つの COMPUTE BY 列を含む、第 2 の結果セットが生成されます。その後、次の書籍のグループに関する第 3 の結果セットと、そのグループの COMPUTE BY 小計を含む第 4 の結果セットが生成されます。COMPUTE SUM(price), SUM(advance) 句の合計を含む最終的な結果セットが生成されるまで、この 2 組の結果セットが交互に配置されます。