Principales respuestas
Mensaje 8632, nivel 17, estado 2, procedimiento filtros_4, línea 4 [línea de inicio de lote 0] Error interno: se ha alcanzado el límite de servicios de una expresión. Busque posibles expresiones complejas en la consulta e intente simplificarlas.

Pregunta
-
saludos tengo el error del titulo ya habia hecho esta consulta pero no he podido arreglarlo
lo que hago es masomenos asi, de que otra forma puedo escribir el codigo para que no me arroje error
WITH
VS_TIPOS AS
(
SELECT
[EQUIPO FILTRAR AUXILIAR],
[Commercial Description] ,
[SUB-CLASE],
TIPO,
EQUIPOFROM VS_EQUIPO
.....
),
VS_TIPOS1 AS ( SELECT * , CASE WHEN [TIPOS] LIKE 'FANCO (AH)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'FANCO (VRF)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'FANCO (SP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'CASSETTE (AH)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'CASSETTE (VRF)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (SP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (VRF)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PISO/TECHO (SP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PISO/TECHO (VRF)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'DUCTO (SP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PAQUETE (CMP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'VENTANA (CMP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'CONDEN (SP)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'CONDEN (VRF)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'CONDEN (INV)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (INV)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (SP) (C)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (SP) (E)' THEN 'EMPRESA' WHEN [TIPOS] LIKE 'PARED (SP) (P)' THEN 'EMPRESA' END AS 'MARCA' FROM VS_TIPOS WHERE [EQUIPO FILTRAR AUXILIAR]='AIRE' ) SELECT * FROM VS_TIPOS1
Donde en cada cte que nombro como VS_xxx estoy aplicando varios CASE
- Editado palermo_software sábado, 13 de agosto de 2016 16:48
Respuestas
-
Exacto.
Las CTE son estructuras en memoria que presentan limitantes, si buscas rendimiento -en un escenario donde manipulas gran cantidad de filas- no lo vas a encontrar en una CTE . Otro "problema" es que los resultados de la CTE persisten sólo hasta la siguiente consulta es por eso que te vez obligado a co-rrelacionarlas. Una tabla temporal es mucho mas rápida y el ámbito de uso está restringido a la conexión actual, no necesitas correlacionarlas, haces uso de ella como si de una tabla se tratase. Analiza tu escenario y aplica uno u otro método según tus necesidades.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Marcado como respuesta Laura CeglzModerator lunes, 15 de agosto de 2016 20:18
Todas las respuestas
-
Hola palermo_software
Ese error aparece cuando se supera el límite en una expresión (generalmente muchas instrucciones CASE). Tener en cuenta que hay un límite en su uso.
El siguiente enlace contiene las recomendaciones para evitar esa situación:
Si te ha servido, vota y marca como respuesta.
Saludos,
Miguel Torres
- Editado Miguel Torres C sábado, 13 de agosto de 2016 16:08
-
Hola palermo_software
Ese error aparece cuando se supera el límite en una expresión (generalmente muchas instrucciones CASE). Tener en cuenta que hay un límite en su uso.
El siguiente enlace contiene las recomendaciones para evitar esa situación:
Si te ha servido, vota y marca como respuesta.
Saludos,
Miguel Torres
-
¿El código de la CTE VS_TIPOS1 es tal cual como lo tienes?. Lo pregunto porque de ser así no le hallo sentido a las instrucciones CASE.
Sugerencia: aunque el optimizador de consultas convertirá la instrucción LIKE al operador EQUAL no tiene sentido usar la instrucción LIKE si no haces uso de comodines que evalúen coincidencia. Por otro lado, puedes utilizar el operador IN para contener los casos a evaluar.
VS_TIPOS1 AS ( SELECT *, CASE WHEN [TIPOS] IN ('FANCOIL (AH)', 'FANCOIL (SP)', <...>) THEN 'MOTOREX' ELSE 'OTRO' END FROM <...> )
Nota que agrego una instrucción ELSE para definir otro tipo si no son de los que contiene el operador IN, sin embargo tú no colocas nada igual en lo que muestras y por esa razón inicie mi comentario indicando que no encuentro sentido a la instrucción CASE, lo que tienes escrito es lo mismo que:
VS_TIPOS1 AS ( SELECT *, 'MOTOREX' FROM VS_TIPOS WHERE [EQUIPO FILTRAR AUXILIAR] = 'AIRE_ACONDICIONADO'; )
En caso el código que colocas es sólo una muestra, te sugiero que sea una muestra que represente el caso que tienes.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
HOLA
Voy a tomar en cuenta la primera recomendación del IN , si yo tambien lo habia pensado asi,pero la expresion que uso es larga y tiene que ser evaluada con muchos case,OSEA AHI NO ACABA
por lo que veo con el WITH VS_XX Igual sale el mismo error-
Nota que agrego una instrucción ELSE para definir otro tipo si no son de los que contiene el operador IN, sin embargo tú no colocas nada igual en lo que muestras y por esa razón inicie mi comentario indicando que no encuentro sentido a la instrucción CASE, lo que tienes escrito es lo mismo que:
No es necesario que salga nada, con que salga NULL es suficiente , la pregunta es bastante específica y es como evitar este problema que seguro ahora que siga evaluando los CTE seguirá apareciendo.
******Por otro lado he probado lo del IN y es mucho mas largo que lo del CSE con like , el tiempo de repsuesta de la consulta
- Editado palermo_software sábado, 13 de agosto de 2016 17:02
-
Si son muchas las CTE correlativas te recomiendo reemplazarlas por tablas temporales. Por otro lado, la idea es que descongestiones la lista de selección <SELECT>, podrías adecuar el siguiente acercamiento:
SELECT *, CASE WHEN t2.Tipo IS NOT NULL THEN 'EMPRESA' END FROM VS_TIPOS t1 LEFT JOIN (VALUES ('FANCO (AH)'), ('FANCO (VRF)'), ('FANCO (SP)')) t2 (Tipo) ON (t1.Tipo = t2.Tipo) WHERE [EQUIPO FILTRAR AUXILIAR] = 'AIRE_ACONDICIONADO'
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
Hola
"Si son muchas las CTE correlativas te recomiendo reemplazarlas por tablas temporales."
Como asi..
"Por otro lado, la idea es que descongestiones la lista de selección <SELECT>, podrías adecuar el siguiente acercamiento:"
Por mi lista de selección en el select esque sale ese problema y repito lo que ya habia posteado
******Por otro lado he probado lo del IN y es mucho mas largo que lo del CSE con like , el tiempo de repsuesta de la consulta
-
No, este último acercamiento nada tiene que ver con el operador IN, lo que hago es definir una tabla derivada que contiene los valores constantes y combino contra la tabla -física o en memoria- a través de la columna [TIPOS], la idea es evaluar sobre un conjunto y no fila por fila.
-
No, este último acercamiento nada tiene que ver con el operador IN, lo que hago es definir una tabla derivada que contiene los valores constantes y combino contra la tabla -física o en memoria- a través de la columna [TIPOS], la idea es evaluar sobre un conjunto y no fila por fila.
-
Exacto.
Las CTE son estructuras en memoria que presentan limitantes, si buscas rendimiento -en un escenario donde manipulas gran cantidad de filas- no lo vas a encontrar en una CTE . Otro "problema" es que los resultados de la CTE persisten sólo hasta la siguiente consulta es por eso que te vez obligado a co-rrelacionarlas. Una tabla temporal es mucho mas rápida y el ámbito de uso está restringido a la conexión actual, no necesitas correlacionarlas, haces uso de ella como si de una tabla se tratase. Analiza tu escenario y aplica uno u otro método según tus necesidades.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Marcado como respuesta Laura CeglzModerator lunes, 15 de agosto de 2016 20:18
-
-
Te respondí:
-------------------------------------------
Exacto.
Las CTE son estructuras<...>
----------------------------------------
Te sugiero un poco de amabilidad, siento que cuestionas y las reglas de cortesía y educación también se extienden a los foros.
- Editado Willams Morales sábado, 13 de agosto de 2016 18:13
-
Te sugiero un poco de amabilidad, siento que cuestionas y las reglas de cortesía y educación también se extienden a los foros.
Hola no se si estos comentarios son por mi, o es su nueva fima, cuestionar es la base de los foros de preguntas,si es por mi el comentario no se porque le genero ese tipo de sentimientos un poco extraños, jamas contesto mal, ni con groserías ni con palabras fuera de tono, mas que hacer enfasis en lo que quiero que se me aclare.
- Editado palermo_software lunes, 15 de agosto de 2016 14:26