Je vais essayer de ne pas copier/coller MSDN
Ce n'est pas grave.
Un CTE est indépendant de l'exécution de la requête :il ne s'agit que d'une construction de langage. Considérez-le comme une table dérivée ou une sous-requête soignée.
Cela signifie qu'à l'exception des CTE récursifs (voir plus loin), tous Les CTE peuvent être codés en ligne. Si vous utilisez le code CTE une fois, c'est pour la lisibilité . Si vous utilisez le CTE deux fois ou plus, alors c'est défensif :vous ne voulez pas faire d'erreur et avoir une table dérivée différente à chaque utilisation.
Lorsqu'un CTE est utilisé deux fois ou plus, ce code sera exécuté deux fois ou plus. Il ne sera pas exécuté une seule fois et mis en cache dans tempdb.
Résumé :cela peut ou non, comme si le code était en ligne.
Remarque :un CTE récursif est simplement une table dérivée à l'intérieur d'une table dérivée à l'intérieur d'une table dérivée à l'intérieur d'une table dérivée à l'intérieur d'un der... donc la même chose s'applique.
Vous pouvez le voir dans Article de Tony Rogerson . L'utilisation de tempdb se produirait de toute façon si elle était codée en ligne. Il note également que l'utilisation d'une table temporaire peut être meilleure en raison de l'expansion "macro" que j'ai expliquée ci-dessus
Pour info :il en va de même pour les vues. Juste des macros.