2010-09-15 5 views
0

J'ai une procédure stockée de ce formatOptimisation des requêtes

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

maintenant lorsque la procédure stockée ci-dessus est l'exécuter me montre une erreur que:

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

Lorsque je modifie la procédure stockée comme ,

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

Cela fonctionne bien.Mais je veux optimiser cela en raison de la créatinine g trop de tables temporaires.

Quelqu'un peut-il m'aider à ce sujet?

+0

Ne pouvez-vous pas faire un 'insérer si n'existe pas dans ....', Quel sql engine/server utilisez-vous? – RobertPitt

+0

Je suppose que la condition 1 et la condition 2 ne s'excluent pas mutuellement? Est ce que '# temp1' et' # temp2' ont la même structure? –

+0

pouvez-vous confirmer si vous utilisez SQLServer, et si oui, quelle version? –

Répondre

0

Vous pouvez supprimer la table au début de la procédure. Il est un peu difficile, mais vous pouvez vérifier l'existence d'une table temporaire comme:

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

Je créerais/déposer la table temporaire en dehors de l'instruction conditionnelle comme ceci:

create table #temp ... 

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

drop table #temp 

En supposant Si votre version de SQL Server les prend en charge et que vous connaissez les différences en termes de consignation et d'annulation des transactions, il peut être préférable d'utiliser une variable de table. De cette façon, vous n'avez pas à vous inquiéter de ne pas être abandonné une fois qu'il est hors de portée.

+0

Sûrement les tables temporaires devraient toujours être abandonnées à la fin de la procédure, de toute façon? –

+0

oui, mais si c'est la dernière chose que la procédure fait de toute façon alors pourquoi l'écrire deux fois? – MLT

0

Vous pouvez essayer d'ajouter TRUNCATE TABLE #temp1 immédiatement avant if(condition 2) dans la première mise en page, mais this question and accepted answer implique qu'une variable de table fonctionnera mieux.