Nom d’objet non valide avec un CTE SQL Server

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 fois un 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.

Utiliser donc une table temporaire au lieu d’un 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.

Utiliser une table temporaire SQL Server à la place du CTE

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é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.