Mi problema (o al menos el mensaje de error) es muy similar al del procesador de consultas que se quedó sin recursos internos: consulta SQL extremadamente larga .
Mi cliente está trabajando con una consulta de selección SQL, que contiene una cláusula where con exactamente 100,000 entradas.
La consulta falla con el error 8632 y el mensaje de error
Error interno: se ha alcanzado un límite de servicios de expresión. Busque expresiones potencialmente complejas en su consulta e intente simplificarlas).
Me resulta muy peculiar que este mensaje de error se arroje, exactamente a 100,000 entradas, así que me pregunto si este es un valor configurable. ¿Es este el caso y, en caso afirmativo, cómo puedo aumentar este valor a uno más alto?
En MSDN , existe la propuesta de reescribir la consulta, pero me gustaría evitar esto.
Mientras tanto, descubrí que la lista de entradas de la que estoy hablando contiene números naturales, algunos de ellos parecen ser secuenciales (algo así como (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Esto hace que la cláusula where de SQL sea algo así como:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Podría transformar esto 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)
¿Puede esto ser acortado por:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
...¿o algo similar? (Sé que es una posibilidad remota, pero haría las actualizaciones de software más fáciles y más legibles)
Para su información: los datos en la cláusula where son el resultado de un cálculo, realizado en otra tabla: primero las entradas de esa tabla se leen y se filtran al principio, luego se realiza un procesamiento adicional (que es imposible hacer usando SQL), el resultado de ese procesamiento adicional es más filtrado y el resultado se usa en la cláusula where. Como era imposible escribir el filtrado completo en SQL, se ha utilizado el método mencionado. Obviamente, el contenido de la cláusula where podría cambiar en cada procesamiento, de ahí la necesidad de una solución dinámica.
WHERE IN
no admite ese tipo de sintaxis de rango. Además, no debería serWHERE () OR () OR ()
AND. Pero para usar la sugerencia de Brent, en realidad no tiene que cambiar toda la consulta, simplemente puede hacerloWHERE IN (SELECT myID FROM #biglist)
. Y#biglist
podría ser una tabla real (permanente) o una tabla temporal que haga sobre la marcha.