Pregunta

¿Por qué no puedes hacer esto? ¿Hay alguna solución?

Obtienes este error.

MSG 2714, Nivel 16, Estado 1, Línea 13 Ya hay un objeto llamado '#Temptable' en la base de datos.

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
¿Fue útil?

Solución

Esta es una pregunta de dos partes y, aunque Kev Fairchild proporciona una buena respuesta a la segunda pregunta, ignora por completo la primera: ¿Por qué se produce el error?

La respuesta está en la forma en que funciona el preprocesador.Este

SELECT field-list INTO #symbol ...

se resuelve en un árbol de análisis que es directamente equivalente a

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

y esto coloca #symbol en la tabla de nombres del ámbito local.El objetivo de _sessionid es proporcionar a cada sesión de usuario un espacio de nombres privado;si especifica dos hashes (##símbolo), este comportamiento se suprime.La activación y desactivación de la extensión sessionid es (obviamente) transparente.

El resultado de todo esto es que múltiples cláusulas INTO #symbol producen múltiples declaraciones en el mismo alcance, lo que lleva al mensaje 2714.

Otros consejos

No puedes hacer eso debido a la resolución de nombres diferida, puedes hacerlo con una tabla real, solo quita los signos de almohadilla.

También puede crear la tabla temporal primero en la parte superior y luego insertarla regularmente en la tabla.

Primer paso...comprueba si la tabla ya existe...si es así, elimínelo.A continuación, cree explícitamente la tabla en lugar de usar SELECT INTO...

Lo encontrará mucho más confiable de esa manera.

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

Además, es de esperar que los nombres de las tablas y los campos estén simplificados para su ejemplo y no sean los que desea. en realidad llámalos ;)

--Kevin Fairchild

La resolución de nombres diferida también es la razón por la que no puede estar seguro de que sp_depends devuelva resultados correctos. Consulte esta publicación que escribí hace un tiempo. ¿Dependes de sp_depends (sin juego de palabras)?

Supongo que el problema es que no has creado el #temptable.

Lo siento, no puedo ser más detallado, pero como ni siquiera has intentado explicar lo que estás viendo, obtienes una respuesta menos que estelar.

Por el aspecto del código, parece que podrías haber estado creando un prototipo de esto en SQL Studio o similar, ¿verdad?¿Puedo adivinar que ejecutó esto varias veces y llegó al punto en que se creó #temptable pero luego falló antes de llegar al final y dejó caer la tabla nuevamente?Reinicie la herramienta de edición de SQL que está utilizando y vuelva a intentarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top