Как проверить, существует ли временная таблица при объединении нескольких временных таблиц? - PullRequest
0 голосов
/ 30 июня 2011

здесь мой запрос-

SELECT final.* into #FinalTemp from
    (   
    select * from #temp1 
        UNION 
    select * from #temp2 
        UNION 
    select * from #temp3 
        UNION 
    select * from #temp4
)final

, но одновременно существует только одна временная таблица, так как проверить, существует ли #temp, затем выполнить объединение или игнорирование?

Ответы [ 2 ]

0 голосов
/ 30 июня 2011

Не лучше ли создать #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,
)

Преобладающим отличием (насколько мне известно) является то, что табличные переменные следуют тем же правилам области видимости, что и другие переменные - они недоступны внутри вызываемой хранимой процедуры и очищаются между пакетами.

0 голосов
/ 30 июня 2011

Вы не можете иметь объединение или запрос к несуществующему объекту во время компиляции (компиляция в план запроса непосредственно перед выполнением).

Так что нет способа сослаться на несуществующий объекттаблица в том же пакете

Шаблон, который вы должны использовать, выглядит следующим образом: динамический SQL - это отдельный пакет

IF OBJECT('tempdb..#temp1') IS NOT NULL
  EXEC ('SELECT * FROM #temp1')
ELSE IF OBJECT('tempdb..#temp3') IS NOT NULL
  EXEC ('SELECT * FROM #temp3')
ELSE IF OBJECT('tempdb..#temp3') IS NOT NULL
  EXEC ('SELECT * FROM #temp3')
...
...