ormlite-servicestack - 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 已切换到使用参数化值,您的大IN()
语句超出了 SQL Server 允许的最大限制。
您可以避免使用较大的参数化值并恢复为使用带有自定义 SQL 片段的无参数 IN 语句:
.Where($"UNIT_ID IN ({ids.SqlJoin()})");
如果愿意,您还可以使用键入的 Column 和 Table names。
推荐阅读
- javascript - 反应导航嵌套堆栈路由名称
- java - 带有锁对象的 Java oracle 教程中的 Bow/Bower 示例
- apache-spark - Kafka 代理的 Spark 结构化流式更改 - 对检查点的影响
- ruby-on-rails - Rails Action Cable:如何获取用户代理和客户端 IP 地址?
- java - Java 方法参考(将方法作为参数传递)
- file - 在 Biztalk 中使用 SFTP 适配器从所有子文件夹中检索文件
- javascript - 选择标签上的更改如何触发更改 img 的 src?
- ruby-on-rails - 回调 after_destroy 未通过 ActiveAdmin 触发
- java - Storing combinations of an array in a list, contains N copies of last item added
- python - 在 Pandas 中达到无穷大时增加值的限制