SQL Server – Erreur interne: une limite de services d'expression a été atteinte

J'ai une procédure stockée SQL Server avec près de 300 variables à l'intérieur.

Les variables ont été créées comme suit:

CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN SUM(Col) OVER(PARTITION BY grp_loc,COMM) ELSE 0 END AS "SALES_1" 

Comme cela a des problèmes de données toutes les variables ont été remplacées comme:

 SUM(CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN Col ELSE 0 END) OVER(PARTITION BY grp_loc,COMM) AS "SALES_1" 

Le problème de données a été résolu par la déclaration ci-dessus, mais la procédure renvoie l'erreur ci-dessous lorsque nous ajoutons toutes les 300 variables, si seulement environ 100 est ajouté, la procédure fonctionne bien.

Erreur interne: une limite de services d'expression a été atteinte. Recherchez les expressions potentiellement complexes dans votre requête et essayez de les simplifier.

Selon la réponse publiée, j'ai essayé de split la requête en plusieurs requêtes de sélection et l'erreur a été résolue, mais en combinant le résultat, datatables n'ont pas été récupérées correctement.

 BEGIN CREATE TABLE #TEMPTAB1 ( TYPE_1 char(15), NUMBER_1 char(7), STATUS_1 char(1), ... ) CREATE TABLE #TEMPTAB2 ( TYPE_2 char(15), NUMBER_2 char(7), STATUS_2 char(1), ... ) CREATE TABLE #TEMPTAB3 ( TYPE_3 char(15), NUMBER_3 char(7), STATUS_3 char(1), ... ) SELECT * FROM #TEMPTAB1 T1 INNER JOIN #TEMPTAB2 T2 ON T1.TYPE_1=T2.TYPE_2 AND T1.NUMBER_1 = T2.NUMBER_2 AND T1.STATUS_1 = T2.STATUS_2 INNER JOIN #TEMPTAB3 T3 ON T1.TYPE_1=T3.TYPE_3 AND T1.NUMBER_1 = T3.NUMBER_3 AND T1.STATUS_1 = T3.STATUS_3 END 

Quelqu'un peut-il s'il vous plaît suggérer un moyen de corriger les jointures dans le code ci-dessus.

S'il vous plaît ré-écrire votre requête!

Ce problème se produit car SQL Server limite le nombre d'identificateurs et de constantes qui peuvent être contenues dans une seule expression d'une requête. Cette limite est de 65 535.

une approche pourrait être:

Vous pouvez split la requête select en plusieurs requêtes select. Stocker le résultat dans des tables temporaires et combiner les résultats à la fin.

Plus d'informations