"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
4 Réponses :
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. p>
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. P>
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/...
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. P>
Au fait, la même requête fonctionne avec plusieurs autres index. P>
Qu'est-ce qui a fonctionné pour moi, remplaçait plusieurs coalesce code> instructions avec
isnull code> chaque fois que possible p>
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. P>
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/...