我的问题(或至少是错误信息)与
query processor ran out of internal resources – extremely long sql query非常相似.
我的客户正在使用sql select-query,其中包含where子句,其中包含100,000个条目.
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个条目,所以我想知道这是否是一个可配置的值.是这种情况,如果是,我怎样才能将此值增加到更高的值?
同时我发现我正在谈论的条目列表包含自然数,其中一些似乎是顺序的(类似于(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%,你可能会遇到不好的时间.