CTE dans CTE dans SQL Server

S'il vous plaît ne pas marquer cette question comme une copy de CTE dans un CTE .. J'ai vérifié cette question et répondre … mais cette réponse ne satisfait pas mon besoin.

Je veux lancer une requête CTE nestede comme celle-ci

Drop Table #Temp Create Table #Temp(name1 text, name2 text) Insert INTO #Temp Values ('test','test') Insert INTO #Temp Values ('test','test') ;WITH CTE1 AS ( With CTE2 as ( Select * from #Temp) ) Select * from CTE1 

ou

 ;WITH CTE1 AS ( Select * From (With CTE2 as ( Select * from #Temp)) ) Select * from CTE1 

Dans notre structure … la requête CTE2 interne a été fournie par un autre système .. donc je ne peux pas contrôler la partie interne de la requête … donc .. mon devoir est seulement de sélectionner les valeurs de la requête interne et de former un nouveau CTE dans mon système …

Et s'il vous plaît imaginez ceci

 ;WITH CTE1 AS ( "Query Provide by Other System" ) 

Dans certains cas le "Requête Fournir par un Autre Système" commence par CTE..Cela peut ou peut ne pas être la requête CTE … c'est le problème exact car je ne peux pas utiliser comme ci-dessous

 ;WITH CTE1 AS ( Select * From ) ,With CTE2 as ( Select * from #Temp)) 

pls aider quelqu'un à prcoeed cela, je suppose que mon besoin est trop dynamic

Juste pour avoir une idée:

 ;WITH cte1 AS ( SELECT * FROM ... ), cte2 as ( SELECT * FROM ... ), cte3 as ( SELECT * FROM ... INNER JOIN cte2 ON... ), SELECT * FROM cte1 INNER JOIN cte3 ON ... 

Séparez vos CTE avec , plutôt que de les imbriquer.

 ; WITH CTE2 AS ( SELECT * FROM #Temp ) , CTE1 AS ( SELECT * FROM CTE2 ) SELECT * FROM CTE1 

EDIT: Suite à vos commentaires supplémentaires

Si je comprends bien, vous recevez une requête générée par le système que vous souhaitez intégrer dans une autre requête. Parfois, cette requête générée par le système utilise un CTE, parfois non. vous ne connaissez pas à l'avance le format de cette requête.

Malheureusement pour vous cela signifie que vous ne pouvez pas l' intégrer dans un autre CTE.

Une option pourrait être d'utiliser des vues réelles.

 CREATE VIEW xxx AS <system generated code here> ; SELECT * FROM xxx ; 

Vous devez cependant faire très attention à la simultanéité. deux users simultanés essayant de créer la même vue avec le même nom.

La meilleure solution serait d'approcher le fournisseur du système en créant la requête générée par le système et en lui demandant comment il propose de l'utiliser.

 ;with BASE AS ( SELECT * FROM table1 ), BASE2 AS ( SELECT * from table2 ), BASE3 AS ( SELECT * FROM table3 ) SELECT * FROM BASE INNER JOIN BASE3 ... 

Je suppose que c'est ce que vous essayez de faire.

Si votre requête générée par le système utilise des noms d'objects qualifiés db, vous pouvez le pirater en utilisant OPENQUERY :

 WITH CTE AS ( SELECT * FROM OPENQUERY([Your Server], 'Query Provide by Other System') ) SELECT * FROM CTE; 

Vous devrez peut-être configurer votre server pour l'access aux données:

 EXEC sp_serveroption 'your server', 'DATA ACCESS', TRUE;