Erro do SQL Server 2005
-
09-06-2019 - |
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
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.