【问题标题】:SQLSTATE[IMSSP]: Tried to bind parameter number 2101. SQL Server supports a maximum of 2100 parametersSQLSTATE[IMSSP]: 尝试绑定参数号 2101。SQL Server 最多支持 2100 个参数
【发布时间】:2017-06-05 04:57:09
【问题描述】:

我正在尝试运行此查询

$claims = Claim::wherein('policy_id', $userPolicyIds)->where('claim_settlement_status', 'Accepted')->wherebetween('intimation_date', [$startDate, $endDate])->get();

在这里,$userPolicyIds 可以有数千个策略 ID。有什么办法可以增加 SQL Server 中的最大参数数?如果没有,谁能帮我找到解决这个问题的方法?

【问题讨论】:

    标签: sql-server laravel-5.4


    【解决方案1】:

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

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

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

    您至少有两个选择:

    • 将您的查询分解成批次,例如,每批次 2000 个项目。

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

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

    【讨论】:

    • 我在 SQL Server 中执行了这个查询:select * from [claims] where [policy_id] in (select id from policies) and [claim_settlement_status] = 'Accepted'。它运行非常顺利,没有任何问题。在此查询中,策略 ID 甚至更多,接近一百万。如果它可以运行此查询,这怎么可能是 SQL 服务器的限制?只是好奇
    • 哦,您问如何“增加 SQL Server 中的最大参数数”,所以我想您明白问题所在了。我修改了答案以解释发生了什么。可以传递给 SQL 查询的参数数量与 SQL 查询可以返回的结果数量完全无关。
    • @ShateelAhmed - 这是您正在使用的流程的实际性质 - 策略 ID 是从另一个表中提取的吗?如果是这样,您应该使用这些详细信息更新您的问题,然后编写一个 single 查询来处理 SQL 中的所有数据,而不是尝试通过多个查询组合结果集。跨度>
    【解决方案2】:

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

    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 的数量总是很大,我想快速解决。

    【讨论】:

      【解决方案3】:

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

      PDO::ATTR_EMULATE_PREPARES => 真

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

      然后拆分 where in on Peaces (where (column in [...]) 或 column in [...])

      【讨论】:

      • 这在本地对我有用,但由于某种原因,在生产服务器上,我收到 The given attribute is only supported on the PDOStatement object. 作为每个查询的异常消息。
      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2021-04-24
      • 2020-11-10
      • 2022-08-04
      • 1970-01-01
      相关资源
      最近更新 更多