2011-12-20 25 views
7

"Błąd wewnętrzny: Osiągnięto limit usług ekspresowych. Poszukaj potencjalnie złożonych wyrażeń w zapytaniu i spróbuj je uprościć."SQL: Błąd, osiągnięto limit usług wyrażania?

Czy ktoś widział to wcześniej i znalazł dobre obejście tego problemu?

Udało mi się obejść ten problem, dzieląc moje zapytanie SQL na dwie części w zasadzie i pisząc pierwsze zapytanie SQL do tabeli tymczasowej, a druga część, nowa instrukcja wyboru SQL, wybiera z tabeli tymczasowej i używa dużo CROSS APPLY operator do obliczenia kaskadowych kolumn obliczeniowych.

Jest to przykład tego, jak wygląda drugich częściowych ale używam dużo więcej Krzyż applys produkować nowe kolumny, które są obliczenia:

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 

moim celem, aby umieścić to w raporcie sql i działa dobrze, jeśli istnieje tylko jeden użytkownik, ponieważ #tempTable zostanie utworzony i usunięty w tym samym wykonaniu, a wyniki zostaną poprawnie wyświetlone w raporcie. Ale w przyszłości, jeśli istnieją współbieżni użytkownicy, obawiam się, że będą pisać do tego samego #tempTable, który wpłynie na wyniki?

Sprawdziłem, wprowadzając to do procedur przechowywanych, ale nadal otrzymuję komunikat o błędzie powyżej.

+2

marzę o świecie, w którym nie mamy całkowicie byłaby nasz kod, aby dopasować się niejasne, archaiczny limitu. Jeśli podzielasz to marzenie, zagłosuj na moją opinię na temat usługi Connect: https://connect.microsoft.com/SQLServer/feedback/details/789949/sql-increase-expression-services-limit-for-complex-nested-in-clauses –

Odpowiedz

6

Ten problem występuje, ponieważ SQL Server ogranicza liczbę identyfikatorów i stałych, które mogą być zawarte w pojedynczym wyrażeniu zapytania. Limit to 65 535. Test liczby identyfikatorów i stałych jest wykonywany po rozszerzeniu SQL Server o wszystkie identyfikatory i stałe. W SQL Server 2005 i wyższej kwerendy są wewnętrznie znormalizowane i uproszczone. Obejmują one * (gwiazdkę), kolumny obliczeniowe itp.

Aby obejść ten problem, przepisz zapytanie. Odniesienie mniejszej liczby identyfikatorów i stałych w największym wyrażeniu w zapytaniu. Musisz upewnić się, że liczba identyfikatorów i stałych w każdym wyrażeniu zapytania nie przekracza limitu. Aby to zrobić, może być konieczne podzielenie zapytania na więcej niż jedno zapytanie. Następnie utwórz tymczasowy wynik pośredni.

+1

Po prostu skopiowałeś i przeszedłeś z witryny mirosoft? Przeczytałem to samo i podzieliłem wyniki na tabelę tymczasową = pośrednie resully (i działałem), ale martwiłem się, że gdybym miał kilku użytkowników, to nie zadziałałoby – Standage

+3

@Paul - nie sądzę, że posiadanie wielu użytkowników spowoduje problemy. Sprawdź ten wpis: http://stackoverflow.com/questions/4725812/temp-table-usuage-in-a-multi-user-environment – TheBoyan

+0

OK okrzyki za odpowiedź! – Standage

1

Po prostu miałem ten problem i naprawiłem go, usuwając indeks UNIQUE na moim stole. Z jakiegoś powodu wydaje się, że powoduje to ten błąd, mimo że nie może ustalić przyczyny.

Nawiasem mówiąc, to samo zapytanie działa z kilkoma innymi indeksami.

1

Co pracował dla mnie było zastąpienie kilku COALESCE sprawozdania z ISNULL ilekroć było to możliwe

Powiązane problemy