Mój problem (lub przynajmniej komunikat o błędzie) jest bardzo podobny do procesora zapytań, w którym zabrakło zasobów wewnętrznych - bardzo długie zapytanie SQL .
Mój klient pracuje z zapytaniem Select SQL, zawierającym klauzulę where zawierającą dokładnie 100 000 wpisów.
Zapytanie kończy się niepowodzeniem z błędem 8632 i komunikatem o błędzie
Błąd wewnętrzny: Osiągnięto limit usług wyrażeń. Wyszukaj potencjalnie złożone wyrażenia w zapytaniu i spróbuj je uprościć).
Uważam za bardzo dziwne, że ten komunikat o błędzie jest generowany dokładnie przy 100 000 wpisów, więc zastanawiam się, czy jest to wartość konfigurowalna. Czy tak jest w przypadku, a jeśli tak, jak mogę zwiększyć tę wartość do wyższej?
W MSDN istnieje propozycja ponownego przepisania zapytania, ale chciałbym tego uniknąć.
Tymczasem dowiedziałem się, że lista wpisów, o których mówię, zawiera liczby naturalne, niektóre z nich wydają się sekwencyjne (coś w rodzaju (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
To sprawia, że klauzula where w SQL wygląda jak:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Mógłbym to przekształcić w:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Czy można to skrócić:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... czy coś podobnego? (Wiem, że to długa szansa, ale dzięki temu aktualizacje oprogramowania byłyby łatwiejsze i bardziej czytelne)
Dla twojej informacji: dane w klauzuli where są wynikiem obliczeń wykonanych w innej tabeli: najpierw wpisy tej tabeli są odczytywane i filtrowane na początku, a następnie przeprowadzane jest dodatkowe przetwarzanie (co jest niemożliwe przy użyciu SQL), wynikiem tego dodatkowego przetwarzania jest więcej filtrowania, a wynik jest wykorzystywany w klauzuli where. Ponieważ napisanie pełnego filtrowania w SQL nie było możliwe, użyto wspomnianej metody. Oczywiście treść klauzuli where może zmieniać się przy każdym przetwarzaniu, stąd potrzeba dynamicznego rozwiązania.
WHERE IN
nie obsługuje tego rodzaju składni zakresu. Ponadto nie powinno byćWHERE () OR () OR ()
AND. Ale aby skorzystać z sugestii Brenta, tak naprawdę nie musisz zmieniać całego zapytania, możesz to zrobićWHERE IN (SELECT myID FROM #biglist)
. I#biglist
może to być prawdziwy (stały) stół lub tymczasowy stół, który tworzysz w locie.