2011-12-20 126 views
7

"Error interno: se ha alcanzado un límite de servicios de expresión. Busque expresiones potencialmente complejas en su consulta e intente simplificarlas".SQL: Error, ¿se alcanzó el límite de servicios de expresión?

¿Alguien ha visto esto antes y ha encontrado una buena solución?

Me las arreglé para solucionar este problema dividiendo mi consulta SQL en dos partes esencialmente y escribiendo la primera consulta de selección SQL en una tabla temporal y la segunda parte, una nueva declaración SQL selecta de la tabla temporal y usa una gran cantidad de El operador CROSS APPLY calcula cascadas columnas calculadas.

Este es un ejemplo de cómo la parte segundo aspecto, sino que estoy usando mucho más applys Cruz para producir nuevas columnas que son cálculos:

Select * from #tempTable   

cross apply 
    (
     select HmmLowestSalePrice = 
     round(((OurSellingPrice + 1.5)/0.95) - (CompetitorsLowestSalePrice) + 0.08, 2) 
    ) as HmmLowestSalePrice 

cross apply 
    (
     select checkLowestSP = 
     case 
     when adjust = 'No Room' then 'No Room' 
     when OrginalTestSalePrice >= CompetitorsLowestSalePrice then 'Minus' 
     when OrginalTeslSalePrice < CompetitorsLowestSalePrice then 'Ok' 
     end 
) as checkLowestSP 

cross apply 
    (
     select AdjustFinalNewTestSP = 
     case 
     when FinalNewTestShipping < 0 Then NewTestSalePrice - (FinalNewTestShipping) 
     when FinalNewTestShipping >= 0 Then NewTestSalePrice 
     end 
) as AdjustFinalNewTestSP 

cross apply 
    (
     select CheckFinalSalePriceWithWP = 
     case 
     when round(NewAdminSalePrice, 2) >= round(wholePrice, 2) then 'Ok' 

     when round(NewAdminSalePrice, 2) < round(wholePrice, 2) then 'Check' 
     end 
    ) as CheckFinalPriceWithWP 


DROP TABLE #tempTable 

Mi objetivo a poner esto en un informe de SQL y se funciona bien si solo hay 1 usuario, ya que el #tempTable se creará y se eliminará en la misma ejecución y los resultados se mostrarán correctamente en el informe. Pero en el futuro, si hay usuarios concurrentes, me preocupa que escriban al mismo #tempTable, lo que afectará los resultados.

He tratado de poner esto en procedimientos almacenados, pero aún aparece el mensaje de error anterior.

+2

Sueño con un mundo donde no tenemos que refactorizar nuestro código totalmente para adaptarse a un límite oscuro, arcaico. Si comparte ese sueño, vote mis comentarios de Connect: https://connect.microsoft.com/SQLServer/feedback/details/789949/sql-increase-expression-services-limit-for-complex-nested-in-lauses –

Respuesta

6

Este problema se produce porque SQL Server limita el número de identificadores y constantes que se pueden contener en una sola expresión de una consulta. El límite es 65,535. La prueba para el número de identificadores y constantes se realiza después de que SQL Server expande todos los identificadores y constantes referenciados. En SQL Server 2005 y superior, las consultas se normalizan y simplifican internamente. Y eso incluye * (asterisco), columnas calculadas, etc.

Para solucionar este problema, vuelva a escribir su consulta. Referencia menos identificadores y constantes en la expresión más grande en la consulta. Debe asegurarse de que el número de identificadores y constantes en cada expresión de la consulta no exceda el límite. Para hacer esto, es posible que deba dividir una consulta en más de una consulta. Luego, crea un resultado intermedio temporal.

+1

¿Acabas de copiar y pasar esto desde el sitio de mirosoft? He leído lo mismo y dividí los resultados en una tabla temporal = resultado intermedio (y lo hice funcionar) pero me preocupaba que si tenía unos pocos usuarios esto no funcionaría – Standage

+3

@Paul - No creo que tener múltiples usuarios causará algún problema. Echa un vistazo a esta publicación: http://stackoverflow.com/questions/4725812/temp-table-usuage-in-a-multi-user-environment – TheBoyan

+0

¡Salud por la respuesta! – Standage

1

Acabo de tener este problema y lo solucioné eliminando el índice UNIQUE en mi mesa. Por alguna razón, eso parece desencadenar este error, aunque no puede entender por qué.

Por cierto, la misma consulta funciona con varios otros índices.

1

Lo que funcionó para mí estaba reemplazando varios COALESCE declaraciones con ISNULL cada vez que era posible

Cuestiones relacionadas