Я бы сосредоточился на различиях между #table и @table. ## table - это глобальная временная таблица, и за более чем 10-летнюю историю использования SQL Server мне еще не приходилось сталкиваться с правильным вариантом использования. Я уверен, что некоторые существуют, но природа объекта делает его крайне непригодным ИМХО.
Ответ на @whiner @marc_s абсолютно верен: распространенный миф о том, что переменные таблицы всегда живут в памяти. На самом деле для табличной переменной довольно распространено переходить на диск и работать так же, как временная таблица.
В любом случае, я предлагаю ознакомиться с множеством различий, следуя ссылкам, указанным @Astander. Большая часть различий заключается в ограничении того, что нельзя делать с переменными @table.