Моя проблема (или, по крайней мере, сообщение об ошибке) очень похожа на обработчике запросов закончились внутренние ресурсы - очень длинный SQL-запрос .
Мой клиент работает с SQL-запросом выбора, содержащим предложение where с ровно 100 000 записей.
Запрос не выполняется с ошибкой 8632 и сообщением об ошибке
Внутренняя ошибка: достигнут лимит служб экспрессии. Пожалуйста, поищите потенциально сложные выражения в вашем запросе и постарайтесь упростить их.)
Я нахожу очень странным, что это сообщение об ошибке выдается точно в 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,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 являются результатом вычислений, выполненных в другой таблице: сначала записи этой таблицы читаются и фильтруются в начале, затем выполняется некоторая дополнительная обработка (что невозможно сделать с помощью SQL), результатом этой дополнительной обработки является дополнительная фильтрация, результат которой используется в предложении where. Поскольку было невозможно написать полную фильтрацию в SQL, упомянутый метод был использован. Очевидно, что содержимое предложения where может меняться при каждой обработке, поэтому необходимо динамическое решение.
WHERE IN
не поддерживает такой синтаксис диапазона. Кроме того , она должна бытьWHERE () OR () OR ()
не AND. Но чтобы воспользоваться предложением Брента, вам не нужно менять весь запрос, вы можете просто сделать этоWHERE IN (SELECT myID FROM #biglist)
. И это#biglist
может быть либо реальная (постоянная) таблица, либо временная таблица, которую вы создаете на лету.