首页 > 解决方案 > ServiceStack ORMLite 5.11.0 SQL 问题 - 参数过多

问题描述

我们看到一个问题,在 ServiceStack ORMLite 5.11.0 版本中,我们收到以下与达到最大 2100 个参数相关的错误。

Exception:
System.Data.SqlClient.SqlException (0x80131904):
The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters and resend the request.

我们最近从 ServiceStack ORMLite 4.0.46 版本升级,我们使用相同的数据集但没有看到这个问题,所以看起来 ORMLite 现在如何处理数据集的逻辑发生了变化。

有没有人遇到过类似的问题,以及如何解决该问题以使其与较新版本的 ServiceStack ORMLite 一起工作?

SQL 从 4.0.46 版本生成:

SELECT "POOL_VEH_UID", "POOL_UID", "UNIT_ID", "START_DT", "END_DT", "CRE_BY_ID", "CRE_TS", "UPD_BY_ID", "UPD_TS"
FROM "POOL_VEH"
WHERE (("UNIT_ID" In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,...2110) AND ("POOL_UID" = CAST('00000000-0000-0000-0000-000000000000' AS UNIQUEIDENTIFIER))) AND ("END_DT" is null));

从 5.11.0 版本生成的 SQL:

SELECT "POOL_VEH_UID", "POOL_UID", "UNIT_ID", "START_DT", "END_DT", "CRE_BY_ID", "CRE_TS", "UPD_BY_ID", "UPD_TS"
FROM "POOL_VEH"
WHERE (("UNIT_ID" In (@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,...@2110) AND ("POOL_UID" = CAST('00000000-0000-0000-0000-000000000000' AS UNIQUEIDENTIFIER))) AND ("END_DT" is null));

标签: ormlite-servicestack

解决方案


问题是因为 OrmLite 已切换到使用参数化值,您的大IN()语句超出了 SQL Server 允许的最大限制。

您可以避免使用较大的参数化值并恢复为使用带有自定义 SQL 片段的无参数 IN 语句:

.Where($"UNIT_ID IN ({ids.SqlJoin()})");

如果愿意,您还可以使用键入的 Column 和 Table names


推荐阅读