如何在Laravel 9中调用SQL Server存储过程RptAAUReport
在Laravel 9中调用SQL Server存储过程的实现方案
针对你提供的RptAAUReport存储过程,以下是Laravel中调用它的具体方法,该存储过程会返回两个结果集:明细数据和统计信息,需要特殊处理多结果集的获取。
前提准备
确保你的Laravel项目已经配置好SQL Server数据库连接:
- 在
config/database.php中确认sqlsrv连接配置正确,包含数据库地址、用户名、密码等信息; - 确保数据库用户拥有该存储过程的执行权限(可通过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
相关产品推荐
相关产品推荐

