As tabelas temporárias não são descartadas automaticamente no final de uma consulta, apenas quando a conexão atual com o banco de dados é descartada ou você as exclui explicitamente com
DROP TABLE #columntable
Teste a existência da tabela no início da consulta ou sempre exclua-a no final (de preferência ambos)
EDIT:Como Matrin disse em seu comentário, isso é realmente um erro de análise. Você obtém o mesmo erro se analisar apenas o SQL como quando o executa.
Para testar isso, separei sua consulta e tentei:
if exists (select 1 from emp where id = 6)
create table #columntable (newcolumns varchar(100))
GO
if not exists (select 1 from emp where id = 6)
create table #columntable (oldcolumns varchar(100))
GO
O analisador está feliz com isso. Curiosamente, se você mudar para usar tabelas não temporárias, a consulta original analisa bem (percebo os problemas que criariam, estava apenas interessado em descobrir por que a consulta não seria analisada).