私の問題(あるいは少なくとも、エラーメッセージは)非常によく似ているクエリプロセッサの内部リソースを使い果たした-非常に長いSQLクエリを。
私の顧客は、正確に100,000エントリのwhere-clauseを含むSQL select-queryを使用しています。
クエリはエラー8632とエラーメッセージで失敗します
内部エラー:式サービスの制限に達しました。クエリで潜在的に複雑な式を探し、それらを単純化してみてください。
このエラーメッセージが正確に100,000エントリでスローされることは非常に奇妙であるため、これが設定可能な値であるかどうか疑問に思います。これは事実ですか?そうであれば、この値をより高い値に増やすにはどうすればよいですか?
上のMSDN、そこにクエリを再書き換えるための提案ですが、私はこの問題を回避したいと思います。
一方、私が話しているエントリのリストには自然数が含まれていることがわかりました。それらのかなりの数は連続しているように見えます( 13,15,16,17,18,19,20)。
これにより、SQLのwhere句は次のようになります。
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,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,...,3,6,...,10,12,13,15,...,20)
...または同様のものですか?(私はそれがロングショットであることを知っていますが、それはソフトウェアの更新をより簡単で読みやすくするでしょう)
参考までに、where-clauseのデータは計算の結果であり、別のテーブルで行われます。最初にそのテーブルのエントリが読み取られ、最初にフィルタリングされ、次に追加の処理が行われます(使用することは不可能です) SQL)、その追加処理の結果はより多くのフィルタリングであり、その結果はwhere-clauseで使用されます。SQLで完全なフィルタリングを記述することは不可能であったため、前述の方法が使用されています。where-clauseの内容は処理ごとに変わる可能性があるため、動的なソリューションが必要であることは明らかです。
WHERE IN
そのような範囲の構文はサポートしていません。また、WHERE () OR () OR ()
AND であってはなりません。しかし、ブレントの提案を使用するには、実際にクエリ全体を変更する必要はありませんWHERE IN (SELECT myID FROM #biglist)
。また#biglist
、実際の(永続的な)テーブル、またはオンザフライで作成する一時テーブルのいずれかです。