Pergunta

Por que você não pode fazer isso e há uma solução alternativa?

Você recebe este erro.

MSG 2714, Nível 16, Estado 1, linha 13 já existe um objeto chamado '#TEMPTABLE' no banco de dados.

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
Foi útil?

Solução

Esta é uma pergunta em duas partes e, embora Kev Fairchild forneça uma boa resposta à segunda pergunta, ele ignora totalmente a primeira - por que o erro é produzido?

A resposta está na forma como o pré-processador funciona.Esse

SELECT field-list INTO #symbol ...

é resolvido em uma árvore de análise que é diretamente equivalente a

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

e isso coloca #symbol na tabela de nomes do escopo local.O negócio com _sessionid é fornecer a cada sessão de usuário um namespace privado;se você especificar dois hashes (##symbol), esse comportamento será suprimido.A mudança e a remoção da extensão sessionid são (obviamente) transparentes.

O resultado de tudo isso é que múltiplas cláusulas INTO #symbol produzem múltiplas declarações no mesmo escopo, levando à Msg 2714.

Outras dicas

Você não pode fazer isso por causa da resolução de nomes adiada, você pode fazer isso com uma mesa real, apenas retire os sinais de libra

Você também pode criar a tabela temporária primeiro na parte superior e depois fazer uma inserção regular na tabela

Primeiro passo...verifique se a tabela já existe...se isso acontecer, exclua-o.Em seguida, crie explicitamente a tabela em vez de usar SELECT INTO...

Você achará muito mais confiável dessa forma.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

Além disso, esperamos que os nomes das tabelas e campos sejam simplificados para o seu exemplo e não sejam o que você realmente chame-os ;)

-Kevin Fairchild

A resolução de nomes adiada também é a razão pela qual você não pode ter certeza de que sp_depends retornará resultados corretos. Confira esta postagem que escrevi há algum tempo Você depende de sp_depends (sem trocadilhos)

Suponho que o problema é que você não criou o #temptable.

Desculpe, não posso ser mais detalhado, mas como você nem tentou explicar o que está vendo, obteve uma resposta nada estelar.

Pela aparência do código, parece que você estava prototipando isso no SQL Studio ou algo semelhante, certo?Posso adivinhar que você executou isso algumas vezes e chegou ao ponto em que foi criado #temptable mas falhou antes de chegar ao fim e derrubar a tabela novamente?Reinicie a ferramenta de edição SQL que você está usando e tente novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top