Mein Problem (oder zumindest die Fehlermeldung) ist dem Abfrageprozessor sehr ähnlich, da ihm die internen Ressourcen ausgehen - extrem lange SQL-Abfrage .
Mein Kunde arbeitet mit einer SQL-Auswahlabfrage, die eine Where-Klausel mit genau 100.000 Einträgen enthält.
Die Abfrage schlägt mit Fehler 8632 und Fehlermeldung fehl
Interner Fehler: Ein Ausdrucksdienstlimit wurde erreicht. Bitte suchen Sie in Ihrer Anfrage nach potenziell komplexen Ausdrücken und versuchen Sie diese zu vereinfachen.)
Ich finde es sehr merkwürdig, dass diese Fehlermeldung genau bei 100.000 Einträgen ausgegeben wird, daher frage ich mich, ob dies ein konfigurierbarer Wert ist. Ist dies der Fall und falls ja, wie kann ich diesen Wert auf einen höheren Wert erhöhen?
Auf MSDN gibt es den Vorschlag, die Abfrage neu zu schreiben, aber ich möchte dies vermeiden.
In der Zwischenzeit habe ich herausgefunden, dass die Liste der Einträge, über die ich spreche, natürliche Zahlen enthält, von denen einige sequenziell zu sein scheinen (so etwas wie (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Dies macht die SQL-WHERE-Klausel ungefähr so:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Ich könnte dies umwandeln in:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Kann dies verkürzt werden durch:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
...oder etwas ähnliches? (Ich weiß, es ist ein langer Weg, aber es würde Software-Updates einfacher und lesbarer machen.)
Zu Ihrer Information: Die Daten in der where-Klausel sind das Ergebnis einer Berechnung, die in einer anderen Tabelle durchgeführt wurde: Zuerst werden die Einträge dieser Tabelle gelesen und zu Beginn gefiltert SQL), das Ergebnis dieser zusätzlichen Verarbeitung ist eine stärkere Filterung, und das Ergebnis wird in der where-Klausel verwendet. Da es unmöglich war, die vollständige Filterung in SQL zu schreiben, wurde die erwähnte Methode verwendet. Offensichtlich kann sich der Inhalt der where-Klausel bei jeder Verarbeitung ändern, weshalb eine dynamische Lösung erforderlich ist.
WHERE IN
diese Art der Bereichssyntax wird nicht unterstützt. Auch sollte esWHERE () OR () OR ()
nicht UND sein. Um den Vorschlag von Brent zu verwenden, müssen Sie jedoch nicht die gesamte Abfrage ändern, sondern können dies einfach tunWHERE IN (SELECT myID FROM #biglist)
. Und es kann#biglist
sich entweder um einen echten (permanenten) Tisch oder einen temporären Tisch handeln, den Sie im Handumdrehen erstellen.