Comment éviter l’erreur SQL Server Nom d’objet non valide avec un CTE ?
Comment exécuter plusieurs requêtes SELECT sur un même CTE ? Pour rappel, un CTE est un objet temporaire qui n’existe qu’entre sa création et sa première utilisation. Cela signifie une suppression juste après la première requête exécutée sur le CTE.
Erreur SQL Server Nom d’Objet non valide avec un CTE
Premièrement, lors de la deuxième utilisation d’un CTE, pour Common Table Expression, une erreur est émise par SQL Server. De plus, cette erreur est rencontrée lorsqu’une requête select utilise plus d’une fois une CTE : Invalid object name ‘MyCTE’ en Anglais, ou en Français avec le message d’erreur ci-dessous:
Msg 208, Niveau 16, Etat 1, Ligne 9
Nom d’objet ‘MyCTE’ non valide.
En fait, seule la première requête SELECT fonctionne, pas la deuxième, ni les requêtes suivantes. Voici un exemple de CTE avec diverses requêtes SELECT exécutées sur celui-ci. Deuxièmement, seule la première instruction SELECT sur le CTE fonctionne. Voici un exemple de CTE pour afficher la date d’hier, la date d’aujourd’hui et la date de demain, depuis la date système.
WITH MyCTE (Yesterday, Today, Tomorrow) AS ( SELECT getdate()-1 as Hier, getdate() as Aujourdhui, getdate()+1 as Demain ); SELECT Hier FROM MyCTE; SELECT Aujourdhui FROM MyCTE; SELECT Demain FROM MyCTE;
Il est impossible d’exécuter plusieurs SELECT sur un CTE
La solution au problème est qu’il est impossible d’exécuter plusieurs fois une instruction SELECT pour un même objet CTE. C’est en quelque sorte un objet à usage unique.
La solution est donc d’utiliser une table temporaire au lieu d’un CTE !
Utiliser une table temporaire SQL Server à la place du CTE
Pour conclure, sur la solution de contournement de cette erreur CTE, les tables temporaires SQL Server sont clairement le meilleur moyen de conserver les résultats et de les interroger plusieurs fois. En effet, cette requête remplaçant le CTE par une table temporaire fonctionne parfaitement.
Vérifier l’existence de la table SQL et, si nécessaire, supprimez-la avant d’éviter les erreurs. Enfin, une autre option est de créer une vraie table, en dur et de la réutiliser. Voici un script pour créer une table de ventes basique.
IF OBJECT_ID('tempdb..#Temp_Table') IS NOT NULL DROP TABLE #Temp_Table SELECT getdate()-1 as Hier, getdate() as Aujourdhui, getdate()+1 as Demain INTO #Temp_Table SELECT Hier FROM #Temp_Table SELECT Aujourdhui FROM #Temp_Table SELECT Demain FROM #Temp_Table