アプリケーションが SQL ステートメントを送信すると、SQL Server は結果データを 1 つ以上の結果セットとして返します。 結果セットは、クエリの条件に一致する行と列のセットです。 SELECT ステートメント、カタログ関数、および一部のストアド プロシージャでは、アプリケーションが表形式で使用できる結果セットが生成されます。 実行される SQL ステートメントがストアド プロシージャ、複数のコマンドを含むバッチ、またはキーワードを含む SELECT ステートメントである場合は、処理する結果セットが複数存在します。
ODBC カタログ関数は、データを取得することもできます。 たとえば、 SQLColumns はデータ ソース内の列に関するデータを取得します。 これらの結果セットには、0 行以上を含めることができます。
GRANT や REVOKE などの他の SQL ステートメントは、結果セットを返しません。 これらのステートメントの場合、通常、 SQLExecute または SQLExecDirect からのリターン コードは、ステートメントが成功したことを示す唯一の兆候です。
各 INSERT、UPDATE、および DELETE ステートメントは、変更の影響を受ける行数のみを含む結果セットを返します。 この数は、アプリケーションが SQLRowCount を呼び出すときに使用できます。 ODBC 3。x アプリケーションでは、 SQLRowCount を呼び出して結果セットを取得するか、 SQLMoreResults を呼び出して取り消す必要があります。 アプリケーションが複数の INSERT、UPDATE、または DELETE ステートメントを含むバッチまたはストアド プロシージャを実行する場合、各変更ステートメントの結果セットを SQLRowCount を使用して処理するか、 SQLMoreResults を使用して取り消す必要があります。 これらのカウントは、バッチまたはストアド プロシージャに SET NOCOUNT ON ステートメントを含めることで取り消すことができます。
Transact-SQL には、SET NOCOUNT ステートメントが含まれています。 NOCOUNT オプションがオンに設定されている場合、SQL Server はステートメントの影響を受ける行の数を返せず、 SQLRowCount は 0 を返します。 SQL Server Native Client ODBC ドライバー バージョンでは、ドライバー固有の SQLGetStmtAttr オプション (SQL_SOPT_SS_NOCOUNT_STATUS) が導入され、NOCOUNT オプションがオンかオフかに関するレポートが表示されます。 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 で利用可能)
統計の設定
印刷
RAISERROR
SQL Server Native Client ODBC ドライバーは、重大度が 11 以上の RAISERROR でSQL_ERRORを返します。 RAISERROR の重大度が 19 以上の場合、接続も削除されます。
SQL ステートメントから結果セットを処理するには、次の手順を実行します。
結果セットの特性を決定します。
列をプログラム変数にバインドします。
1 つの値、値の行全体、または複数の値の行を取得します。
より多くの結果セットがあるかどうかをテストし、存在する場合は、ループして新しい結果セットの特性を判断します。
データ ソースから行を取得してアプリケーションに返すプロセスは、フェッチと呼ばれます。