7
votes

SQL: erreur d'erreur, expression limite de service atteinte?

"Erreur interne: une limite des services d'expression a été atteinte. Veuillez rechercher des expressions potentiellement complexes dans votre requête et essayer de les simplifier."

Quelqu'un a-t-il déjà vu cela avant et trouvé une bonne solution de contournement? P>

J'ai réussi à contourner ce problème en fractionnant ma requête SQL en deux parties essentiellement et en écrivant la première requête SQL Sélectionner sur une table Temp et la deuxième partie, une nouvelle instruction SQL SELECT choisit à partir de la table temporaire et utilise beaucoup de croix. Appliquez l'opérateur pour calculer des colonnes calculées en cascade. P>

Il s'agit d'un exemple de la manière dont la deuxième partie ressemble mais j'utilise beaucoup plus de croix s'applique pour produire de nouvelles colonnes qui sont des calculs: P>

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


1 commentaires

Je rêve d'un monde où nous n'avons pas à refacturer totalement notre code pour s'adapter à une limite obscure, archaïque. Si vous partagez ce rêve, veuillez voter mon commentaire Connect: Connect.Microsoft.com/sqlserver/feedback/Détails/789949/...


4 Réponses :


7
votes

Ce problème se produit car SQL Server limite le nombre d'identificateurs et de constantes pouvant être contenues dans une seule expression d'une requête. La limite est de 65 535. Le test du nombre d'identifiants et de constantes est effectué après que SQL Server élargit tous les identificateurs et constantes référencées. Dans SQL Server 2005 et plus, les requêtes sont normalisées et simplifiées internes. Et cela inclut * (astérisque), colonnes calculées, etc.

Pour contourner ce problème, réécrivez votre requête. Référence moins d'identificateurs et de constantes dans la plus grande expression de la requête. Vous devez vous assurer que le nombre d'identifiants et de constantes dans chaque expression de la requête ne dépasse pas la limite. Pour ce faire, vous devrez peut-être briser une requête dans plus d'une seule requête. Ensuite, créez un résultat intermédiaire temporaire.


2 commentaires

N'as-tu juste copié et passé cela depuis le site Mirosoft? J'ai lu la même chose et j'ai divisé les résultats en une table Temp = intermédiaire Volydiate (et que je l'ai travaillé), mais que si j'avais quelques utilisateurs, cela ne fonctionnerait pas


@Paul - Je ne pense pas que les multiples utilisateurs entraîneront des problèmes. Découvrez ce message: Stackoverflow.com/questions/4725812/...



1
votes

Je viens d'avoir ce problème et je l'ai réparé en supprimant l'index unique sur ma table. Pour une raison quelconque, cela semble déclencher cette erreur, bien qu'il ne puisse pas comprendre pourquoi.

Au fait, la même requête fonctionne avec plusieurs autres index.


0 commentaires

1
votes

Qu'est-ce qui a fonctionné pour moi, remplaçait plusieurs coalesce instructions avec isnull chaque fois que possible


0 commentaires

0
votes

Le même problème m'arrive lorsque nous avons essayé de modifier le niveau de compatibilité de la base de données à 150. Ce n'est pas un problème quand il est 140 ou moins.


0 commentaires