Le @table
la syntaxe crée une variable de table (une table réelle dans tempdb
) et y matérialise les résultats.
Le WITH
la syntaxe définit une expression de table commune
qui n'est pas matérialisé et n'est qu'une vue en ligne.
La plupart du temps, vous feriez mieux d'utiliser la deuxième option. Vous mentionnez que c'est à l'intérieur d'une fonction. S'il s'agit d'un TVF, la plupart du temps, vous souhaitez qu'ils soient en ligne plutôt que multi-instructions afin qu'ils puissent être développés par l'optimiseur - cela interdirait instantanément l'utilisation de variables de table.
Cependant, parfois (par exemple, la requête sous-jacente est coûteuse et vous souhaitez éviter qu'elle ne soit exécutée plusieurs fois), vous pouvez déterminer que la matérialisation des résultats intermédiaires améliore les performances dans certains cas spécifiques. Il y a actuellement impossible de forcer cela pour les CTE (sans forcer un guide de plan au moins )
Dans cette éventualité, vous avez (en général) 3 options. Une @tablevariable
, #localtemp
table et un ##globaltemp
table. Cependant, seul le premier d'entre eux est autorisé à être utilisé dans une fonction.
Pour plus d'informations concernant les différences entre les variables de table et les tables #temp voir ici .