In our internal discussion forum for SQL Server, somebody asked this question.  Here is the answer (Thanks G2)

Temporary tables & table variables differ in semantics, capability and query performance. Which one is appropriate for you will depend on your circumstances.
 
Temporary table operations run under the user transaction (user controls commit/rollback.) Table variable operations run under a system transaction -- statement success/error controls commit/rollback.
 
Temporary tables allow altering of tables after create (create index, add/alter/drop columns etc) Table variables do not allow alter after declare.
 
Temporary tables leverages statistics based query recompile. Table variables do not.
 
A simple rule of thumb would be to use table variables for small results/simple queries & use temporary tables for larger results/complex queries (assuming semantics & capability differences do not matter.)