none
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. RRS feed

  • 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,
    EQUIPO

    FROM 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 




    sábado, 13 de agosto de 2016 15:44

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.
    sábado, 13 de agosto de 2016 17:55

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:

    https://social.technet.microsoft.com/Forums/es-ES/f238ca0f-90da-41e9-841e-bdc61c32f849/mensaje-8632-nivel-17-estado-2-procedimiento-filtros3-lnea-4-lnea-de-inicio-de-lote-0-error?forum=sqlserveres

    Si te ha servido, vota y marca como respuesta.

    Saludos,


    Miguel Torres


    sábado, 13 de agosto de 2016 16:07
  • 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:

    https://social.technet.microsoft.com/Forums/es-ES/f238ca0f-90da-41e9-841e-bdc61c32f849/mensaje-8632-nivel-17-estado-2-procedimiento-filtros3-lnea-4-lnea-de-inicio-de-lote-0-error?forum=sqlserveres

    Si te ha servido, vota y marca como respuesta.

    Saludos,


    Miguel Torres


    es la misma pregunta que yo hice.
    sábado, 13 de agosto de 2016 16:11
  • palermo_software,

    ¿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.
    sábado, 13 de agosto de 2016 16:37
  • 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

    sábado, 13 de agosto de 2016 16:47
  • palermo_software,

    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.
    sábado, 13 de agosto de 2016 17:04
  • 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

    sábado, 13 de agosto de 2016 17:10
  • palermo_software,

    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.

    sábado, 13 de agosto de 2016 17:33
  • palermo_software,

    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.

    Ok, ahora explicame lo de las tablas temporales te refieres a las #tabla
    sábado, 13 de agosto de 2016 17:35
  • 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.
    sábado, 13 de agosto de 2016 17:55
  • nuevamente te pregunto hablas de esto

    #tabla

    sábado, 13 de agosto de 2016 18:03
  • 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. 


    sábado, 13 de agosto de 2016 18:11
  • 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.


    lunes, 15 de agosto de 2016 14:20