В общем, вы должны выбрать обратное, если это возможно. Это зависит от того, нужно ли вам хранить набор элементов или просто значения результата.
Переменные с областью видимости, кроме табличных, относительно дешевы. Вещи, которые вписываются в типизированные переменные, которые не являются таблицами, работают быстрее, чем их хранение в виде отдельных строк в таблице.
Табличные переменные и временные таблицы, как правило, довольно дороги. Они могут требовать места в базе данных tempdb, а также не предлагают никакой оптимизации по умолчанию. Кроме того, следует избегать табличных переменных для больших наборов данных. При обработке больших наборов вы можете применять индексы и определять первичные ключи для временных таблиц, если хотите, но вы не можете сделать это для табличных переменных. Наконец, временные таблицы необходимо очистить перед выходом из области действия.
Для параметров табличные переменные полезны для возврата наборов из функций. Временные таблицы не могут быть возвращены из функций. В зависимости от поставленной задачи использование функций может облегчить инкапсуляцию определенных частей работы. Вы можете обнаружить, что некоторые хранимые процедуры выполняют работу, которая лучше подходит для функций, особенно если вы повторно используете, но не изменяете результаты.
Наконец, если вам просто нужно одноразовое хранение результатов в середине хранимой процедуры, попробуйте CTE. Они обычно бьют как переменные таблиц, так и временные таблицы, поскольку сервер SQL может принимать более правильные решения о том, как хранить эти данные для вас. Кроме того, из-за синтаксиса это может сделать ваши объявления более разборчивыми.
Использование выражений общей таблицы @ MSDN
редактировать: (относительно временных таблиц)
Локальные временные таблицы исчезают по окончании сеанса запроса, что может занять неопределенное количество времени в будущем. Глобальные временные таблицы не исчезают до тех пор, пока соединение не будет закрыто и другие пользователи не будут использовать эту таблицу, что может быть даже дольше. В любом случае лучше всего удалить временные таблицы (поскольку они больше не нужны) при выходе из процедуры, чтобы не связывать память и другие ресурсы.
CTE могут использоваться для предотвращения этого, во многих случаях, потому что они являются только локальными по отношению к месту, где они объявлены. Они автоматически помечаются для очистки после выхода из хранимой процедуры или функции их области действия.