2010-09-15 2 views
0

У меня есть хранимая процедура этого форматаОптимизация запросов

if(condition 1) 
begin 
(
    ----- 
    ----- 
    select into #temp1 
    ---- 
    drop #temp1 
) 
end 
if(condition 2) 
begin 
(
    ----- 
    ----- 
    select into #temp1 
    ---- 
    drop #temp1 
) 
end 

теперь, когда выше хранимая процедура его выполнения показывает мне ошибку что:

"There is already an object named '#temp1' in the database." 

Когда я изменить хранимую процедуру, как ,

if(condition 1) 
begin 
(
    ----- 
    ----- 
    select into #temp1 
    ---- 
    drop #temp1 
) 
end 
if(condition 2) 
begin 
(
    ----- 
    ----- 
    select into #temp2 
    ---- 
    drop #temp2 
) 
end 

Это хорошо работает. Но я хочу оптимизировать это из-за креатина g слишком много временных таблиц.

Может ли кто-нибудь помочь мне в этом?

+0

Можете ли вы сделать «вставку, если она не существует в ....», какой SQL-движок/сервер вы используете? – RobertPitt

+0

Предполагаю, что условие 1 и условие 2 не являются взаимоисключающими? У '# temp1' и' # temp2' есть одна и та же структура? –

+0

Вы можете подтвердить, используете ли вы SQLServer, и если да, то какая версия? –

ответ

0

Вы можете отказаться от таблицы в начале процедуры. Это немного сложнее, но вы можете проверить наличие временной таблицы, как:

if object_id('tempdb..#temp1') is not null 
    drop table #temp1 
0

Я бы создать/удалить таблицу временную вне условного оператора, как это:

create table #temp ... 

if(condition 1) 
begin 
(
    ----- 
    ----- 
    select into @temp 
    ---- 
) 
end 
if(condition 2) 
begin 
(
    ----- 
    ----- 
    select into @temp2 
    ---- 
) 
end 

drop table #temp 

Если предположить, что ваша версия SQL Server поддерживает их, и вы знаете о различиях в терминах ведения журнала и откат транзакций, может быть лучше использовать переменную таблицы. Таким образом, вам не нужно беспокоиться о том, что он не будет сброшен после того, как он выйдет из сферы действия.

+0

Несомненно, временные таблицы всегда должны быть отброшены в конце процедуры, во всяком случае? –

+0

да, но если это последнее, что делает процедура в любом случае, то зачем писать его дважды? – MLT

0

Вы можете попробовать добавить TRUNCATE TABLE #temp1 непосредственно перед if(condition 2) в первом макете, но this question and accepted answer подразумевает, что переменная таблицы будет работать лучше.

Смежные вопросы