php odbc_exec没有返回所有结果

时间:2015-12-01 21:16:55

标签: php sql-server odbc

我们目前正在运行一些复杂的查询,这些查询在MS SQL中返回大型数据集,导出到Excel,并将这些作为报告提供给我们的用户。我们要做的是通过执行查询并将结果写入文件供用户下载,在Drupal(在Windows Server上运行)上自动执行这些报告。

以下是一个查询的样子,它返回86,972行,包含66列,并在134秒内执行(在MS SQL 2008客户端中执行时):

    Select with 16 JOINS    
    UNION    
    Select with 7 JOINS    
    UNION     
    Select with 12 JOINS    
    UNION    
    Select with 11 JOINS

当我通过PHP执行此查询时,只返回3608行,执行时间为70秒到300秒。我还检查了1200的ini_get(' max_execution_time'),因此它没有超时。

当我通过仅执行第一个Select语句组(仅返回47,158行,而不是86,972)并减少列数来简化此查询时,我会得到更多结果:

Columns - Rows returned

66 - 3608

58 - 4059

32 - 8105

16 - 32,051

11 - 32,407

5 - 47,158

我不知道该怎么做,似乎通过PHP执行查询并没有返回与在MS SQL客户端中运行它时相同的结果。有没有人知道使用ODBC_EXEC或ODBC_EXECUTE时返回的数据集是否有任何限制(我也尝试过)?非常感谢任何帮助!

Here is the PHP code that we are using: 


    $dbhandle = odbc_connect($odbcmgt_dsn,$odbcmgt_user,$odbcmgt_pwd,SQL_CUR_USE_ODBC);
    $queryResult = odbc_exec($dbhandle, $sql);
    $filename = 'path\test.csv';
    $delimiter = ',';

    //print max execution time
    $maxEx = ini_get('max_execution_time');
    dpm("Max Execution Time: " . $maxEx);

    //open file to write into
    $fp = fopen($filename,'w');

    //retrieve number of columns, print column names to array
    $columnHeaderArray =  array();
    $numColsRet = odbc_num_fields($queryResult);    
    for($i = 1; $i <= $numColsRet; $i++){
        $columnHeaderArray[$i] = odbc_field_name($queryResult,$i);
    }       

    $numRowsRet = 0;    

    //print column names to the file
    fputcsv($fp,$columnHeaderArray,$delimiter);

    //print each row to the file
    while($row = odbc_fetch_array($queryResult)) {
        fputcsv($fp, $row,$delimiter);
        $numRowsRet++;
    }   

    //print connection error if any
    $error = odbc_errormsg($dbhandle);
    dpm("error message: ".$error);
    if($error != '') { drupal_set_message('<pre>'.var_export($error,true). '</pre>'); }

    //print number of rows
    dpm("Num records: " . $numRowsRet);

    //close file that was written into
    fclose($fp);
    odbc_close($dbhandle);

0 个答案:

没有答案