我们目前正在运行一些复杂的查询,这些查询在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);