Je me concentrerais sur les différences entre #table et @table. ##table est une table temporaire globale et, pour mémoire, en plus de 10 ans d'utilisation de SQL Server, je n'ai pas encore rencontré de cas d'utilisation valable. Je suis sûr que certains existent mais la nature de l'objet le rend hautement inutilisable IMHO.
La réponse de @marc_s à @whiner est absolument vraie : c'est un mythe répandu que les variables de table vivent toujours en mémoire. Il est en fait assez courant qu'une variable de table aille sur le disque et fonctionne comme une table temporaire.
Quoi qu'il en soit, je vous suggère de vous renseigner sur l'ensemble des différences en suivant les liens indiqués par @Astander. La plupart des différences impliquent des limitations sur ce que vous ne pouvez pas faire avec les variables @table.