2009-08-12 98 views
8

He creado un procedimientoSQL Server muestra "nombre de objeto no válido '#temp'" cuando se trabaja con una tabla temporal

create procedure testProcedure_One 
as 
DECLARE @Query nvarchar(4000) 

begin 
SET @Query = 'SELECT * into #temptest FROM Table1' 

Exec sp_Executesql @query 

SELECT * FROM #temptest 
drop table #temptest 
end 

Cuando ejecuto el procedimiento testProcedure_One estoy recibiendo el mensaje de error:

Invalid object name '#temp' 

Pero si uso ##temp means que está funcionando:

create procedure testProcedure_two 
as 
DECLARE @Query nvarchar(4000) 

begin 

SET @Query = 'SELECT * into ##temptest FROM Table1' 


Exec sp_Executesql @query 

SELECT * FROM ##temptest 
drop table ##temptest 
end 

testProcedure_two está trabajando muy bien

cuál podría ser el problema? ¿Cómo puedo resolverlo?

Respuesta

12

Presumiblemente tiene el siguiente código que SELECCIONA de #temp, ¿le ha dado el error?

Todo depende del alcance. ## temp es una tabla temporal global, disponible en otras sesiones. #temp es una tabla temporal "local", solo accesible por el alcance de ejecución actual. sp_executesql se ejecuta bajo un alcance diferente, por lo que insertará los datos en #temp, pero si intenta acceder a esa tabla fuera de la llamada sp_executesql, no la encontrará.

p. Ej. Este errores como #test se crea y sólo es visible a, el contexto sp_executesql:

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test' 
SELECT * FROM #Test 

Los trabajos anteriores con ## prueba, ya que crea una tabla temporal global.

Esto funciona, ya que SELECT es parte del mismo ámbito.

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test' 

Mis preguntas serían:

  1. lo que realmente necesita para utilizar tablas temporales, puede no encontrar una solución sin ellos, por ejemplo, usando una subconsulta?
  2. ¿Realmente necesita ejecutar SQL así usando sp_executesql?
+0

Gracias. Sé que estaba fuera del alcance, pero no me pareció que tenía que hacer la selección con la misma consulta. – Jebli

1

para que lo ejecutes, creo que la #tmp_table debería crearse primero usando una declaración ddl.

Luego ejecuta su ejecutivo y el proceso almacenado que ha creado en el ejecutivo debe tener el mismo nombre temp table viz.#tmp_table.

0

crear la tabla temporal mediante el uso de crear la tabla y luego utilice INSERT INTO para insertar los valores en lugar de SELECT INTO.

Esto me solucionó el problema.

Cuestiones relacionadas