我有一个存储过程,它创建一个临时表(#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个结果集.
提前致谢.
解决方法:
我实际上只是遇到了类似的问题,并设法让以下工作:
$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()是必不可少的,所以我认为这是真正的答案.