Estou tentando fazer isso em um procedimento:
DECLARE @a bit = 1;
BEGIN
SELECT * INTO #aTemp FROM OPENROWSET( ... );
IF @a = 0
BEGIN
SELECT ... INTO #bTemp FROM #aTemp;
END
ELSE
BEGIN
SELECT ... INTO #bTemp FROM #aTemp;
END
END
Eu recebo o erro:
Msg 2714, Level 16, State 1, Line 10
There is already an object named '#bTemp' in the database.
Por que isso está acontecendo e há uma solução alternativa?
Atualizar
Tentei adicionar uma DROP
declaração conforme sugerido aqui , mas ainda não funcionou:
DECLARE @a bit = 1;
BEGIN
SELECT * INTO #aTemp FROM OPENROWSET( ... );
IF @a = 0
BEGIN
IF OBJECT_ID('[tempdb]..#bTemp') IS NOT NULL
BEGIN
DROP TABLE #bTemp;
END
SELECT ... INTO #bTemp FROM #aTemp;
END
ELSE
BEGIN
IF OBJECT_ID('[tempdb]..#bTemp') IS NOT NULL
BEGIN
DROP TABLE #bTemp;
END
SELECT ... INTO #bTemp FROM #aTemp;
END
END
Pela documentação :
Acabei criando a tabela antes do
IF
bloco assim:Esta NÃO é uma resposta para a pergunta, apenas uma demonstração para @SebastienMeine como ##tabelas temporárias globais podem eliminar a simultaneidade.
Em uma janela, faça o seguinte:
Resultado:
Em seguida, abra outra janela e faça o seguinte:
Resultados:
Portanto, a tabela ## ainda existe, embora o procedimento em que foi criado tenha terminado há muito tempo.
Depois que a primeira janela terminar, tente executar esta parte na primeira janela novamente:
Resultado:
Portanto, a tabela ## ainda existe, embora o mesmo usuário esteja simplesmente tentando criá-la novamente.
Isso ilustra que:
Aqui está uma solução que eu uso se a tabela temporária não puder ser criada antecipadamente e não quiser colocar a lógica central no SQL dinâmico.