SQLSTATE [IMSSP]:尝试绑定参数号2101.SQL Server最多支持2100个参数

时间:2017-06-05 04:57:09

标签: sql-server laravel-5.4

我正在尝试运行此查询

sudo passwd username

在这里,$claims = Claim::wherein('policy_id', $userPolicyIds)->where('claim_settlement_status', 'Accepted')->wherebetween('intimation_date', [$startDate, $endDate])->get(); 可以有数千个策略ID。有什么办法可以增加SQL Server中的最大参数数量吗?如果没有,有人可以帮我找到解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:1)

wherein方法创建格式为WHERE policy_id IN (userPolicyIds[0], userPolicyIds[1], userPolicyIds[2]..., userPolicyIds[MAX])的SQL片段。换句话说,整个集合都被解包到SQL语句中。结果是SQL Server拒绝执行的 HUGE SQL语句。

这是Microsoft SQL Server的一个众所周知的限制。这是一个硬性限制,因为似乎没有改变它的选择。但SQL Server很难被指责有这个限制,因为尝试执行多达2000个参数的查询是一种不健康的情况,你不应该把它自己放在首位。

因此,即使有办法改变限制,仍然建议保留限制,并重新调整代码,以免出现这种不健康的情况。

您至少有几个选择:

  • 将您的查询分解为批量,例如每个2000项。

  • 将您的字段添加到临时表中,并使您的查询加入该表。

就个人而言,我会选择第二种选择,因为它的性能会比其他任何选项都要好得多,并且可以随意扩展。

答案 1 :(得分:1)

我通过运行此原始查询解决了这个问题

SELECT claims.*, policies.* FROM claims INNER JOIN policies ON claims.policy_id = policies.id 
                    WHERE policy_id IN $userPolicyIds AND claim_settlement_status = 'Accepted' AND intimation_date BETWEEN '$startDate' AND '$endDate';

此处,$userPolicyIds是一个类似此('123456','654321','456789')的字符串。这个查询有点慢,我承认这一点。但政策ID的数量总是非常大,我想快速解决。

答案 2 :(得分:0)

只需使用prepare driver_options(PDO :: prepare)

PDO :: ATTR_EMULATE_PREPARES =>真

https://docs.microsoft.com/en-us/sql/connect/php/pdo-prepare

并将其分为和平([...中的列]或[...]中的列)

相关问题