Exécuter plusieurs requêtes SELECT sur le même CTE sans erreur




Comment exécuter plusieurs requêtes SELECT sur un même CTE? Lors de la deuxième requête SELECT sur un CTE cette erreur est retournée par SQL Server:

(1 row(s) affected)
Msg 208, Level 16, State 1, Line 9
Invalid object name ‘MonCTE’.

En effet, la première requête SELECT sur le CTE fonctionne mais pas les suivantes. Voici un exemple de CTE avec les requêtes SELECT :

WITH MonCTE (Hier, Aujourdhui, Demain) AS
(
  SELECT		getdate()-1 as Hier,
  getdate() 	as Aujourdhui,
  getdate()+1 as Demain
)

SELECT Hier			FROM MonCTE

SELECT Aujourdhui	FROM MonCTE

SELECT Demain		FROM MonCTE

 

Comment exécuter plusieurs fois une requête SELECT sur le même CTE sans erreur ?

Pour rappel, sous SQL Server, un CTE est un objet temporaire qui n’existe qu’après sa création et est supprimé après la première requête faite dessus.
Il faut donc utiliser une table temporaire pour conserver les résultats.

Utiliser une table temporaire car il est impossible de lancer plusieurs fois la requête sur le même CTE.

Cette requête qui remplace 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;

 

Note: Attention à bien vérifier si la table existe et la supprimer au préalable pour éviter les erreurs.