Mon problème (ou du moins le message d'erreur) est très similaire au processeur de requêtes à court de ressources internes - requête SQL extrêmement longue .
Mon client travaille avec une requête de sélection SQL, contenant une clause where avec exactement 100 000 entrées.
La requête échoue avec l'erreur 8632 et le message d'erreur
Erreur interne: une limite de services d'expression a été atteinte. Veuillez rechercher des expressions potentiellement complexes dans votre requête et essayez de les simplifier.)
Je trouve très particulier que ce message d'erreur soit lancé, exactement à 100 000 entrées, donc je me demande si c'est une valeur configurable. Est-ce le cas et si oui, comment puis-je augmenter cette valeur à une valeur plus élevée?
Sur MSDN , il est proposé de réécrire la requête, mais j'aimerais éviter cela.
Pendant ce temps, j'ai découvert que la liste des entrées dont je parle contient des nombres naturels, certains d'entre eux semblent être séquentiels (quelque chose comme (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Cela fait de la clause where SQL quelque chose comme:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Je pourrais transformer cela en:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Cela peut-il être raccourci par:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... ou quelque chose de similaire? (Je sais que c'est long, mais cela rendrait les mises à jour logicielles plus faciles et plus lisibles)
Pour votre information: les données de la clause where sont le résultat d'un calcul effectué sur une autre table: d'abord les entrées de cette table sont lues et filtrées au début, puis un traitement supplémentaire est effectué (ce qui est impossible à faire en utilisant SQL), le résultat de ce traitement supplémentaire est plus de filtrage et le résultat est utilisé dans la clause where. Comme il était impossible d'écrire le filtrage complet en SQL, la méthode mentionnée a été utilisée. De toute évidence, le contenu de la clause where peut changer à chaque traitement, d'où la nécessité d'une solution dynamique.
WHERE IN
ne prend pas en charge ce type de syntaxe de plage. De plus, ce ne devraitWHERE () OR () OR ()
pas être ET. Mais pour utiliser la suggestion de Brent, vous n'avez pas réellement à modifier la requête entière, vous pouvez simplement le faireWHERE IN (SELECT myID FROM #biglist)
. Et#biglist
peut être soit une vraie table (permanente), soit une table temporaire que vous créez à la volée.