我有一个存储过程,该存储过程创建了一个临时表(#test),用另一个表中的数据填充它,在此临时表上运行3个选择并将其删除。
原始表的大小超过20 GB,并且3条SELECT语句在原始SP上包含许多不同的条件。
我正在使用SQLSRV从PHP执行SP,但是我只能设法检索两个第一个结果集。
如果我从MSSMS运行SP,它将运行正常并按预期返回3个结果集。但是从PHP它将仅返回2(尝试每个组合)。
不知道驱动程序sqlsrv_fetch_array或sqlsrv_next_result是否有问题。
SP的示例(select语句太大,因此我将恢复它们):
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()是必不可少的,所以我认为这是真正的答案。
关于php - SQLSRV和存储过程中的多项选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19169124/