You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel调用MSSQL存储过程,如何获取多个查询结果集?

获取MSSQL存储过程的多个结果集(Laravel)

你遇到的问题很常见——Laravel的DB::select()方法默认只会读取存储过程返回的第一个结果集,要拿到所有结果,得直接用底层的PDO连接来处理,因为PDO原生支持多结果集的遍历。

解决方案:直接操作PDO实例

下面是具体的实现步骤,用PDO的方法来获取两个结果集:

// 获取SQL Server连接的PDO实例
$pdo = DB::connection('sqlsrv')->getPdo();

// 准备存储过程调用(用参数绑定更安全)
$stmt = $pdo->prepare('EXEC StoredProcedureName @userID=?');
// 执行存储过程,传入参数
$stmt->execute([1]);

// 读取第一个结果集(notifications表的数据)
$notifications = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 切换到下一个结果集
$stmt->nextRowset();

// 读取第二个结果集(Customers表的数据)
$customers = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 关闭游标,释放数据库资源
$stmt->closeCursor();

// 现在可以使用两个结果集了
// 比如打印查看:
dd($notifications, $customers);

通用封装(支持任意数量的结果集)

如果你的存储过程可能返回更多结果集,可以封装一个通用函数,自动遍历所有结果:

function fetchAllProcedureResults(string $connectionName, string $procedure, array $params = []): array
{
    $pdo = DB::connection($connectionName)->getPdo();
    $stmt = $pdo->prepare($procedure);
    $stmt->execute($params);

    $results = [];
    // 循环读取所有结果集,直到没有更多
    do {
        $results[] = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } while ($stmt->nextRowset());

    $stmt->closeCursor();
    return $results;
}

// 使用示例:解构获取两个结果集
[$notifications, $customers] = fetchAllProcedureResults(
    'sqlsrv',
    'EXEC StoredProcedureName @userID=?',
    [1]
);

为什么DB::select()不行?

Laravel的DB::select()方法在底层实现时,只调用了一次fetchAll()来获取结果,并没有处理后续的结果集。所以当存储过程返回多个结果时,它只会返回第一个,剩下的结果集会被忽略。

内容的提问来源于stack exchange,提问作者Saeed Vaziry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:00:47