sql-server – 由于WHERE子句中有超过100,000个条目,因此SQL Server错误8632

前端之家收集整理的这篇文章主要介绍了sql-server – 由于WHERE子句中有超过100,000个条目,因此SQL Server错误8632前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题(或至少是错误信息)与 query processor ran out of internal resources – extremely long sql query非常相似.

我的客户正在使用sql select-query,其中包含where子句,其中包含100,000个条目.

查询失败,错误8632和错误消息

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query,and try to simplify them.)

我发现这个错误消息被抛出非常奇怪,完全是100,000个条目,所以我想知道这是否是一个可配置的值.是这种情况,如果是,我怎样才能将此值增加到更高的值?

MSDN,有重新重写查询的建议,但我想避免这种情况.

同时我发现我正在谈论的条目列表包含自然数,其中一些似乎是顺序的(类似于(1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20).

这使得sql where子句类似于:

where entry in (1,20)

我可以将其转换为:

where (entry between 1 and 3) OR
      (entry between 6 and 10) OR
      (entry between 12 and 13) OR
      (entry between 15 and 20)

可以通过以下方式缩短:

where entry in (1,...,20)

……或类似的东西? (我知道这是一个很长的镜头,但它会使软件更新更容易,更可读)

为了您的信息:where子句中的数据是计算的结果,在另一个表上完成:首先在开始时读取和过滤该表的条目,然后完成一些额外的处理(这是不可能的sql),额外处理的结果是更多过滤,其结果用于where子句.由于无法在sql中编写完整的过滤,因此使用了上述方法.显然,where子句的内容可能会在每次处理时发生变化,因此需要动态解决方案.

解决方法

搜索超过100,000个值,请将它们放在临时表中,每个值要搜索一行.然后,将您的查询加入该临时表进行过滤.

超过100,000个值的东西不是参数 – 它是一个表.考虑Swart’s Ten Percent Rule,而不是考虑提高限制,如果你接近sql Server限制的10%,你可能会遇到不好的时间.

猜你在找的MsSQL相关文章