Les tables temporaires sont comme des tables ordinaires dans la plupart des caractéristiques, sauf qu'elles vont dans TempDB au lieu de la base de données actuelle, et elles disparaissent après une portée limitée (selon qu'elles sont basées sur une session ou sur des tables temporaires globales. Mais toutes les modifications apportées aux données dans les tables temporaires sont connecté au journal des transactions, avec toutes les implications de performances que cela implique. otoh, vous pouvez également ajouter autant d'indices ou de vues, ou de déclencheurs, ou tout ce que vous voulez à une table temporaire exactement comme vous le feriez pour une table ordinaire.
Les variables de table sont une sorte de table en mémoire raccourcie (elles utilisent également la base de données temporaire). Leurs modifications ne sont pas enregistrées (cela améliore les performances). Mais vous ne pouvez obtenir qu'un seul index dessus (car les index ne peuvent pas être créés après l'instruction de déclaration initiale, le seul index que vous pouvez créer sur une variable de table est celui qui peut être inclus dans la déclaration de variable de table initiale...
Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20))
En raison de ces caractéristiques, les tables temporaires sont un meilleur choix pour les grandes tables (larges et avec de nombreuses lignes) et/ou qui subiront plus d'un modèle d'accès au cours de leur vie, tandis que les variables de table sont les meilleures lorsque vous avez besoin d'une table très étroite ( keys only table, ou key avec une seule colonne de données), qui sera toujours accessible par cette clé indexée...