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

如何在Laravel 9中调用SQL Server存储过程RptAAUReport

在Laravel 9中调用SQL Server存储过程的实现方案

针对你提供的RptAAUReport存储过程,以下是Laravel中调用它的具体方法,该存储过程会返回两个结果集:明细数据和统计信息,需要特殊处理多结果集的获取。

前提准备

确保你的Laravel项目已经配置好SQL Server数据库连接:

  1. 在config/database.php中确认sqlsrv连接配置正确,包含数据库地址、用户名、密码等信息;
  2. 确保数据库用户拥有该存储过程的执行权限(可通过SQL语句GRANT EXECUTE ON [dbo].[RptAAUReport] TO [你的数据库用户];授权)。

方法一:直接使用PDO处理多结果集

这种方式可以完整获取存储过程返回的所有结果集:

use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

// 1. 准备参数(根据业务需求赋值,null参数直接传null即可)
$dateFrom = Carbon::parse('2023-01-01')->toDateTimeString();
$dateTo = Carbon::parse('2023-01-31')->toDateTimeString();
$organizationId = 1;
$cityId = null;
$stateId = null;
$userId = "550e8400-e29b-41d4-a716-446655440000"; // GUID格式字符串,无值则传null
$status = "Active"; // 无值则传null

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

// 3. 准备存储过程调用语句
$stmt = $pdo->prepare("EXEC [dbo].[RptAAUReport] @DateFrom = ?, @DateTo = ?, @OrganizationID = ?, @CityID = ?, @StateID = ?, @USERID = ?, @Status = ?");

// 4. 绑定参数(顺序必须和存储过程定义的参数顺序一致)
$stmt->bindParam(1, $dateFrom, \PDO::PARAM_STR);
$stmt->bindParam(2, $dateTo, \PDO::PARAM_STR);
$stmt->bindParam(3, $organizationId, \PDO::PARAM_INT);
$stmt->bindParam(4, $cityId, \PDO::PARAM_INT);
$stmt->bindParam(5, $stateId, \PDO::PARAM_INT);
$stmt->bindParam(6, $userId, \PDO::PARAM_STR);
$stmt->bindParam(7, $status, \PDO::PARAM_STR);

// 5. 执行存储过程
$stmt->execute();

// 6. 获取第一个结果集:报表明细数据
$reportDetails = $stmt->fetchAll(\PDO::FETCH_ASSOC);

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

// 8. 获取第二个结果集:报表统计信息(总记录数、组织/城市/州名称等)
$reportSummary = $stmt->fetch(\PDO::FETCH_ASSOC);

// 9. 关闭游标释放连接
$stmt->closeCursor();

// 使用数据示例
// $totalRecords = $reportSummary['TotalRecords'];
// $organizationName = $reportSummary['Organization'];

方法二:封装为模型静态方法(推荐)

将调用逻辑封装到模型中,便于复用:

namespace App\Models;

use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

class AAUReport
{
    public static function getReport($dateFrom, $dateTo, $organizationId = null, $cityId = null, $stateId = null, $userId = null, $status = null)
    {
        // 统一日期格式转换
        $dateFrom = Carbon::parse($dateFrom)->toDateTimeString();
        $dateTo = Carbon::parse($dateTo)->toDateTimeString();

        $pdo = DB::connection('sqlsrv')->getPdo();
        $stmt = $pdo->prepare("EXEC [dbo].[RptAAUReport] @DateFrom = ?, @DateTo = ?, @OrganizationID = ?, @CityID = ?, @StateID = ?, @USERID = ?, @Status = ?");

        $stmt->bindParam(1, $dateFrom, \PDO::PARAM_STR);
        $stmt->bindParam(2, $dateTo, \PDO::PARAM_STR);
        $stmt->bindParam(3, $organizationId, \PDO::PARAM_INT);
        $stmt->bindParam(4, $cityId, \PDO::PARAM_INT);
        $stmt->bindParam(5, $stateId, \PDO::PARAM_INT);
        $stmt->bindParam(6, $userId, \PDO::PARAM_STR);
        $stmt->bindParam(7, $status, \PDO::PARAM_STR);

        $stmt->execute();

        $details = $stmt->fetchAll(\PDO::FETCH_ASSOC);
        $stmt->nextRowset();
        $summary = $stmt->fetch(\PDO::FETCH_ASSOC);

        $stmt->closeCursor();

        return compact('details', 'summary');
    }
}

在控制器中调用:

use App\Models\AAUReport;

public function showReport()
{
    $report = AAUReport::getReport('2023-01-01', '2023-01-31', 1, null, null, '550e8400-e29b-41d4-a716-446655440000', 'Active');
    
    // 传递数据到视图
    return view('reports.aau', [
        'details' => $report['details'],
        'summary' => $report['summary']
    ]);
}

注意事项

  • 参数顺序必须严格匹配存储过程定义的顺序,否则会导致参数绑定错误;
  • uniqueidentifier类型的@USERID参数,直接传入字符串格式的GUID即可;
  • 如果只需要第一个结果集(明细数据),可以简化为使用DB::select:
    $details = DB::select("EXEC [dbo].[RptAAUReport] @DateFrom = ?, @DateTo = ?, @OrganizationID = ?, @CityID = ?, @StateID = ?, @USERID = ?, @Status = ?", [
        $dateFrom, $dateTo, $organizationId, $cityId, $stateId, $userId, $status
    ]);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:55:17