適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQLMoreResultsにより、アプリケーションを複数の結果の行のセットを取得できます。SQLMoreResults allows the application to retrieve multiple sets of result rows. COMPUTE 句を含む Transact-SQLTransact-SQL SELECT ステートメント、または ODBC ステートメントや Transact-SQLTransact-SQL ステートメントの送信済みのバッチによって、SQL ServerSQL Server Native Client ODBC ドライバーは複数の結果セットを生成します。A Transact-SQLTransact-SQL SELECT statement containing a COMPUTE clause, or a submitted batch of ODBC or Transact-SQLTransact-SQL statements, causes the SQL ServerSQL Server Native Client ODBC driver to generate multiple result sets. SQL ServerSQL Server では、どの場合もサーバー カーソルを作成して結果を処理することはできません。does not allow creating a server cursor to process the results in either case. したがって、開発者は ODBC ステートメントがブロックされていることを確認する必要があります。Therefore, the developer must ensure that the ODBC statement is blocking. また、同じ接続で他のアクティブなステートメントからのデータを処理する前に、返されたデータをすべて処理するか ODBC ステートメントを取り消す必要があります。The developer must exhaust the returned data or cancel the ODBC statement before processing data from other active statements on the connection.


COMPUTE 句を含む Transact-SQLTransact-SQL SELECT ステートメントは、SQL Server 2012 (11.x)SQL Server 2012 (11.x) より前のサーバー バージョンの接続している場合にのみサポートされます。A Transact-SQLTransact-SQL SELECT statement containing a COMPUTE clause is only supported when connecting to a server version prior to SQL Server 2012 (11.x)SQL Server 2012 (11.x).

開発者は、Transact-SQLTransact-SQL SELECT ステートメントの COMPUTE 句で生成される結果セットの列と行のプロパティを確認できます。The developer can determine properties of the result sets columns and rows that are generated by the COMPUTE clause of a Transact-SQLTransact-SQL SELECT statement. 詳細については、次を参照してください。 SQLColAttributeします。For more detail, see SQLColAttribute.

ときにSQLMoreResultsと呼びます取り出されていないデータ行の結果セットに、これらの行は失われ、次の結果行セットから行のデータは利用可能になっています。When SQLMoreResults is called with unfetched data rows in the result set, those rows are lost, and row data from the next result row set is made available.


void GetComputedRows  
    SQLHSTMT hStmt  
    SQLUSMALLINT    nCols;  
    SQLUSMALLINT    nCol;  
    SQLRETURN       sRet;  
    UINT            nRow;  
    SQLINTEGER      nComputes = 0;  
    SQLINTEGER      nSet;  
    BYTE*           pValue;  
    // If SQLNumResultCols failed, then some error occurred in  
    //  statement execution. Exit.  
    if (!SQL_SUCCEEDED(SQLNumResultCols(hStmt, (SQLSMALLINT*) &nCols)))  
        goto EXIT;  
    // Determine the presence of COMPUTE clause result sets. The SQL  
    //  Server Native Client ODBC driver uses column attributes to report multiple  
    //  sets. The column number must be less than or equal to the   
    //  number of columns returned. You are guaranteed to have at least  
    //  one, so use '1' for the SQLColAttribute ColumnNumber  
    //  parameter.  
    SQLColAttribute(hStmt, 1, SQL_CA_SS_NUM_COMPUTES,  
        NULL, 0, NULL, (SQLPOINTER) &nComputes);  
    // Create a result info structure pointer array, one element for  
    //  the normal result rows and one for each compute result set.  
    //  Initialize the array to NULL pointers.  
    pODBCSetInfo = new ODBCSETINFO[1 + nComputes];  
    // Process the result sets...  
    nSet = 0;  
    while (TRUE)  
        // If required, get the column information for the result set.  
        if (pODBCSetInfo[nSet].pODBCColInfo == NULL)  
            if (pODBCSetInfo[nSet].nCols == 0)  
                SQLNumResultCols(hStmt, (SQLSMALLINT*) &nCols);  
                pODBCSetInfo[nSet].nCols = nCols;  
            if (GetColumnsInfo(hStmt, pODBCSetInfo[nSet].nCols,  
                &(pODBCSetInfo[nSet].pODBCColInfo)) == SQL_ERROR)  
                goto EXIT;  
        // Get memory for bound return values if required.  
        if (pODBCSetInfo[nSet].pRowValues == NULL)  
        // Rebind columns each time the result set changes.  
        myBindCols(hStmt, pODBCSetInfo[nSet].nCols,  
        // Set for ODBC row array retrieval. Fast retrieve for all  
        //  sets. COMPUTE row sets have only a single row, but  
        //  normal rows can be retrieved in blocks for speed.  
        SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_BIND_TYPE,  
            (void*) pODBCSetInfo[nSet].nResultWidth, SQL_IS_UINTEGER);  
        SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_ARRAY_SIZE,  
            (void*) pODBCSetInfo[nSet].nRows, SQL_IS_UINTEGER);  
        SQLSetStmtAttr(hStmt, SQL_ATTR_ROWS_FETCHED_PTR,  
            (void*) &nRowsFetched, sizeof(SQLINTEGER));  
        while (TRUE)  
            // In ODBC 3.x, SQLFetch supports arrays of bound rows or  
            //  columns. SQLFetchScroll (or ODBC 2.x SQLExtendedFetch)  
            //  is not necessary to support fastest retrieval of   
            //  data rows.  
            if (!SQL_SUCCEEDED(sRet = SQLFetch(hStmt)))  
            for (nRow = 0; nRow < (UINT) nRowsFetched; nRow++)  
                for (nCol = 0; nCol < pODBCSetInfo[nSet].nCols;  
                    // Processing row and column values...  
        // sRet is not SQL_SUCCESS and is not SQL_SUCCESS_WITH_INFO.  
        //  If it's SQL_NO_DATA, then continue. If it's an  
        //  error state, stop.  
        if (sRet != SQL_NO_DATA)  
        // If there's another set waiting, determine the result set  
        //  indicator. The indicator is 0 for regular row sets or an  
        //  ordinal indicating the COMPUTE clause responsible for the  
        //  set.  
        if (SQLMoreResults(hStmt) == SQL_SUCCESS)  
            sRet = SQLColAttribute(hStmt, 1, SQL_CA_SS_COMPUTE_ID,  
                NULL, 0, NULL, (SQLPOINTER) &nSet);  
    // Clean-up anything dynamically allocated and return.  

参照See Also

SQLMoreResults 関数 SQLMoreResults Function
ODBC API 実装の詳細ODBC API Implementation Details