SQL: Ошибка, предел служб выражений достигнут? - PullRequest
7 голосов
/ 21 декабря 2011

"Внутренняя ошибка. Достигнуто ограничение служб выражений. Пожалуйста, поищите потенциально сложные выражения в своем запросе и попробуйте упростить их."

Кто-нибудь видел это раньше и нашел хороший обходной путь?

Мне удалось обойти эту проблему, разделив мой SQL-запрос по существу на две части и записав первый SQL-запрос выбора во временную таблицу, а во второй - новый SQL-оператор выбора выбирает из временной таблицы и использует многооператора CROSS APPLY для вычисления каскадных вычисляемых столбцов.

Это пример того, как выглядит вторая часть, но я использую больше Cross Applys для создания новых столбцов, которые являются вычислениями:

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

Моя цель - поместить это в отчет sql, и он будет работать нормально, если есть только 1 пользователь, так как #tempTable будет создан и отброшен в том же исполнении, а результаты правильно отображаются в отчете.Но в будущем, если будут параллельные пользователи, я обеспокоен тем, что они будут писать в тот же #tempTable, что повлияет на результаты?

Я смотрел на это в хранимых процедурах, но все равно получаю сообщение об ошибке выше.

Ответы [ 3 ]

6 голосов
/ 21 декабря 2011

Эта проблема возникает из-за того, что SQL Server ограничивает количество идентификаторов и констант, которые могут содержаться в одном выражении запроса. Лимит составляет 65 535. Проверка количества идентификаторов и констант выполняется после того, как SQL Server развернет все ссылочные идентификаторы и константы. В SQL Server 2005 и выше запросы внутренне нормализованы и упрощены. И это включает * (звездочка), вычисляемые столбцы и т. Д.

Чтобы обойти эту проблему, перепишите запрос. Ссылка на меньшее количество идентификаторов и констант в самом большом выражении в запросе. Вы должны убедиться, что количество идентификаторов и констант в каждом выражении запроса не превышает предела. Для этого вам, возможно, придется разбить запрос на несколько запросов. Затем создайте временный промежуточный результат.

1 голос
/ 07 октября 2016

Для меня сработало замена COALESCE операторов на ISNULL, когда это было возможно

1 голос
/ 23 мая 2012

У меня просто была эта проблема, и я исправил ее, удалив УНИКАЛЬНЫЙ индекс на моей таблице.По какой-то причине это, кажется, вызывает эту ошибку, хотя не может понять, почему.

Кстати, тот же запрос работает с несколькими другими индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...