CTE SQL Server avec plusieurs Select

Comment exécuter plusieurs requêtes SELECT sur un même CTE SQL Server ? Tout d’abord, un CTE (Common Table Expression) permet de réutiliser le résultat d’une requête de sélection. C’est un jeu de données temporaire, disponible uniquement durant le script. Le CTE est largement utilisé notamment pour créer des requêtes récursives.

Il est vrai que 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’.

Plusieurs requêtes SELECT sur un CTE SQL Server

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;

Sous SQL Server, un CTE pour Common Table Expression est un objet temporaire qui n’existe qu’après sa création. Il est ensuite supprimé après la première requête exécutée dessus.

Il faut donc utiliser une table temporaire pour conserver les résultats.

Utiliser une table temporaire car il est impossible de lancer plusieurs requêtes sur un 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;

Par ailleurs, faire attention à vérifier si la table existe et la supprimer au préalable pour éviter les erreurs.

Enfin, voici un tutoriel sur un autre sujet SQL Server qui montre comment faire pivoter des lignes en colonnes depuis une table SQL Server. Il faut utiliser la requête SQL Server PIVOT.

Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


*