我有一个存储过程,它创建一个临时表(#test),用另一个表中的数据填充它,在这个时态表上运行3选择并删除它。
原始表格大于20 GB且3个SELECT语句在原始SP上包含许多不同的条件。
我正在使用SQLSRV从PHP执行SP但是我只能设法检索2个第一个结果集。
如果我从MSSMS运行SP,它将运行正常并按预期返回3个结果集。但是从PHP开始,它将返回2(尝试每种组合)。
不确定驱动程序是否存在问题,sqlsrv_fetch_array或sqlsrv_next_result。
SP的示例(选择语句太大,所以我只是恢复它们):
CREATE PROCEDURE sp_transfers
@dt date,
@campaign varchar(16)
AS
BEGIN
CREATE TABLE #test ( [column definitions...] )
BEGIN
INSERT INTO #test SELECT * FROM sometable WHERE dt = @dt AND campaign = @campaign
SELECT * FROM #test ...
SELECT * FROM #test ...
SELECT * FROM #test ...
DROP TABLE #test
END
现在从PHP开始,这是我的测试代码:
$q = sqlsrv_query($conn,"EXEC sp_transfers @dt='2013-10-01',@campaign='1234'");
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // EMPTY
但是,如果我尝试这样做有效:
sqlsrv_next_result($q);
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up
这个组合也是如此:
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset
sqlsrv_next_result($q);
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up
我在这里做错了吗?或者有没有办法从单个SP中获取3个结果集。
提前致谢。
答案 0 :(得分:8)
我实际上只是遇到了类似的问题,并设法让以下工作:
$result = array();
// Get return value
do {
while ($row = sqlsrv_fetch_array($query)) {
// Loop through each result set and add to result array
$result[] = $row;
}
} while (sqlsrv_next_result($query));
print_r($result);
do-while循环将在所有结果中前进(而不是必须手动执行此操作)。 似乎循环遍历sqlsrv_fetch_array()是必不可少的,所以我认为这是真正的答案。
答案 1 :(得分:0)
// this example for storing the data in drop down menu - php
// need to connect data base first
$connectionInfo = array( "Database"=>$database, "UID"=>DATABASE_USER, "PWD"=>DATABASE_PASSWORD);
$conn = sqlsrv_connect( $serverName, $connectionInfo);
/// $SQLquery = NOTE write sql query here
$stmt = sqlsrv_query( $conn, $SQLquery );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
} else {
Display("SQLquery executed");
}
$result = array();
$fetchLimit = 0; // control the infinite loop
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
//echo $row['COLUMN_NAME']. "<br>";
// Loop through each result set and add to result array
$result[] = $row['COLUMN_NAME'];
// results store here = you need to change 'COLUMN_NAME' based on yoru sql query received data name
$fetchLimit++;
if($fetchLimit>60000)
break;
}
echo dropdown( "test", $result, 1000 );
add this function for storing in drop down
function dropdown( $name, array $options, $selected=null )
{
/*** begin the select ***/
$dropdown = '<select name="'.$name.'" id="'.$name.'">'."\n";
$selected = $selected;
/*** loop over the options ***/
foreach( $options as $key=>$option )
{
/*** assign a selected value ***/
$select = $selected==$key ? ' selected' : null;
/*** add each option to the dropdown ***/
$dropdown .= '<option value="'.$key.'"'.$select.'>'.$option.'</option>'."\n";
}
/*** close the select ***/
$dropdown .= '</select>'."\n";
/*** and return the completed dropdown ***/
return $dropdown;
}