Nom d’objet non valide avec un CTE SQL Server

Comment éviter l’erreur Nom d’objet non valide avec un CTE SQL Server ? 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.

Premièrement, lors de la deuxième utilisation d’un CTE, pour Common Table Expression, une erreur est émise par SQL Server.

Comment éviter l’erreur Nom d’Objet non valide avec un CTE 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:
(1 ligne(s) affectée(s))
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 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.

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

La solution : Il est impossible d’exécuter plusieurs fois une instruction SELECT pour un même CTE . Utilisez donc une table temporaire au lieu d’un CTE !

Pour conclure, sur la solution de contournement de cette erreur CTE : les tables temporaires sont définitivement 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.

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

Vérifiez l’existence de la table 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.