【发布时间】:2020-02-28 21:01:01
【问题描述】:
我的 SQL Server 插入限制有问题。当我研究解决方案时,我有两种方法来解决我的问题。第一个是编辑SQL配置文件(但也许我会问我的前辈是否可以更改,因为如果由于我所做的错误SQL配置导致数据库端出现错误,可能会影响客户端)。第二种解决方案很简单,但我不知道是否应该循环执行,或者有一种方法可以在 Laravel/PHP 中使用?
这是我面临的错误:
SQL Server 最多支持 2100 个参数。
SQLSTATE[IMSSP]: 尝试绑定参数号 2101。SQL Server 最多支持 2100 个参数。
这是我制作的示例代码:
$userPermissions = [];
$branchPermissionUser = BranchPermissionUser::get()->where('branch_id', $branchIdFrom)->whereIn('user_id', $userIds);
foreach($userIds as $userId) {
$permissionIds = $branchPermissionUser->where('user_id', $userId)->pluck('permission_id');
foreach($permissionIds as $permissionId) {
$userPermissions[] = [
'user_id' => $userId,
'branch_id' => $branchIdTo,
'permission_id' => $permissionId
];
}
}
BranchPermissionUser::insert($userPermissions);
你会注意到我所做的逻辑是首先我初始化一个空的 $userPermissions 数组,然后每个用户的 $permissionId 是我将推送 $userPermissions。
有一个实例,这个数组长度 ($userPermissions) 将超过 2100。一旦数组长度超过 2100,我将面临 SQL 插入错误。
为了解决这个问题,我在想 Laravel/PHP 中是否有一种方法可以将其作为 By batch of 2100 插入。for 循环是否足以解决这个问题?或者你有什么办法可以解决这个问题?
【问题讨论】:
-
最简单的方法是使用集合而不是数组。它支持
chunk($callback)方法。 -
听起来您可能需要考虑使用Table Valued Parameters
-
感谢@nigel,这是另一个值得一读的内容。我也会这样做以避免大块大块!!!
标签: php sql sql-server laravel optimization