Generally, you would use a temporary table (#) instead of a table variable. Table variables are really only useful for
- functions, which cannot create temporary objects
- passing table-valued data (sets) as read-only parameters
- gaming statistics for certain query edge-cases
- execution plan stability (related to statistics and also the fact that INSERT INTO table variables cannot use a parallel plan)
- prior to SQL Server 2012, #temp tables inherit collation from the tempdb whereas @table variables uses the current database collation
Other than those, a #temporary table will work as well as if not better than a variable.
Further reading: What's the difference between a temp table and table variable in SQL Server?