Не лучше ли создать #FinalTemp
в качестве явной временной таблицы в верхней части запроса, а затем заменить существующие методы заполнения, которые, как я полагаю, выглядят так:
SELECT * INTO #temp1 FROM ... /* Rest of Query */
С:
INSERT INTO #FinalTemp (Columns...)
SELECT * FROM ... /* Rest of Query */
И тогда вам совсем не обязательно делать этот последний шаг объединения. Или, если вам нужны 4 отдельные временные таблицы (возможно, для многоэтапных операций над каждой), определите каждую из них в начале вашего запроса, и тогда они будут все существовать при выполнении объединения.
Теперь, если вы сказали, что будет заполнен только один (так что остальные будут пустыми), это, вероятно, спорный вопрос, но я всегда склонен использовать UNION ALL
для объединения непересекающихся таблиц - если вы неявно полагаетесь на UNION
s функция удаления дубликатов?
Вы можете объявить временные таблицы, используя тот же синтаксис, что и для реальных таблиц:
CREATE TABLE #FinalTemp (
ColumnA int not null primary key,
ColumnB varchar(20) not null,
ColumnC decimal(19,5) null,
)
Или, как вы уже упоминали, вы можете использовать переменные таблицы, а не временные таблицы:
declare @FinalTemp table (
ColumnA int not null primary key,
ColumnB varchar(20) not null,
ColumnC decimal(19,5) null,
)
Преобладающим отличием (насколько мне известно) является то, что табличные переменные следуют тем же правилам области видимости, что и другие переменные - они недоступны внутри вызываемой хранимой процедуры и очищаются между пакетами.