Моя проблема (або принаймні повідомлення про помилку) дуже схожа на запит процесора, у якого не вистачало внутрішніх ресурсів - надзвичайно довгий запит sql .
Мій клієнт працює з запитом на вибір SQL, що містить пункт де саме 100 000 записів.
Помилка запиту з помилкою 8632 та повідомленням про помилку
Внутрішня помилка: досягнуто ліміту служб вираження даних. Будь ласка, знайдіть у запиті потенційно складні вирази та спробуйте їх спростити.)
Я вважаю дуже своєрідним, що це повідомлення про помилку викидається саме на 100 000 записів, тому мені цікаво, чи це налаштоване значення. Це так і якщо так, то як я можу збільшити це значення до більш високого?
У MSDN є пропозиція переписати запит, але я хотів би цього уникнути.
Тим часом я з’ясував, що список записів, про які я говорю, містить натуральні числа, досить багато з них здаються послідовними (щось на зразок (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Це робить SQL-де-пунктом щось на зразок:
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), результатом цієї додаткової обробки є більше фільтрування, і результат цього використовується в пункті де-де. Оскільки неможливо було написати повну фільтрацію в SQL, був використаний згаданий метод. Очевидно, що зміст де-пункту може змінюватися при кожній обробці, отже, необхідність динамічного рішення.
WHERE IN
не підтримує такий синтаксис діапазону. Також це не повинно бутиWHERE () OR () OR ()
ТА. Але, щоб використовувати пропозицію Brent, вам насправді не потрібно змінювати весь запит, ви могли просто зробитиWHERE IN (SELECT myID FROM #biglist)
. І#biglist
може бути або справжнім (постійним) столом, або тимчасовою таблицею, яку ви робите на льоту.