2011-11-07 36 views
25

Estaba intentando seleccionar ... en una tabla temporal #TempTable en sp_Executedsql. No está insertado correctamente o no, pero hay mensajes escritos allí (359 fila (s) afectados) que significa insertado con éxito? escritura abajoEjecute sp_executeSql para seleccionar ... en #table pero no puede seleccionar los datos de la tabla de temperatura

DECLARE @Sql NVARCHAR(MAX); 
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
      from SPCTable with(nolock) 
      where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To'; 

SET @Sql = 'DECLARE @Date_From VARCHAR(10); 
      DECLARE @Date_To VARCHAR(10); 
      SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      '+ @Sql; 

EXECUTE sp_executesql @Sql; 

Después de ejecutada, su yo retorno de mensajes (359 fila (s) affected). A continuación, cuando intentes seleccionar los datos de #TempTable.

Select * From #TempTable; 

Su Regrésame:

Msg 208, Level 16, State 0, Line 2 
Invalid object name '#TempTable'. 

Se sospecha que su única la sección de trabajo 'seleccionar' solamente. La inserción no está funcionando. ¿cómo solucionarlo?

Respuesta

25

tabla temporal local #table_name es visible en la sesión actual, globales temporales ##table_name tablas son visibles en todas las sesiones. Ambas vidas hasta que su sesión esté cerrada. sp_executesql - crea su propia sesión (tal vez la palabra "alcance" sería mejor) así que es por eso que sucede.

+2

Creo que la palabra "alcance" sería mejor. 'DECLARE @sql NVARCHAR (MAX); SET @sql = 'SELECCIONAR @@ SPID'; EJECUTAR sp_executesql @sql; SELECCIONE @@ SPID' –

+0

Gracias @Michal, ya recordé este método de uso. Gracias de nuevo – Worgon

+0

La cuestión era cómo solucionarlo. No por qué se rompe. Proporcioné la respuesta correcta a continuación. 'INSERT INTO @tmpTbl EXEC sp_executesql @ sql' –

3

Las tablas temporales solo viven mientras la conexión las crea. Esperaría que esté emitiendo involuntariamente la selección en una conexión separada. Puede probar esto haciendo momentáneamente su inserción en una tabla no temporal y ver si sus datos están allí. Si ese es el caso, puede volver a su solución original y simplemente asegúrese de pasar el objeto de conexión a su selección.

29

El uso de una tabla temporal global en este escenario podría causar problemas ya que la tabla existiría entre sesiones y podría ocasionar algunos problemas al utilizar el código de llamada de forma asincrónica.

Se puede usar una tabla temporal local si se definió antes de llamar a sp_executesql p. Ej.

CREATE TABLE #tempTable(id int); 

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; 

SELECT * FROM #tempTable; 
1

Para evitar este problema, utilice un comando CREATE TABLE #temptable primero en generar una tabla temporal vacío antes de ejecutar sp_executesql. A continuación, ejecute el INSERT INTO #TEMPTABLE con sp_executesql. Esto funcionará Así es como supero este problema ya que tengo una configuración en la que todas mis consultas generalmente se ejecutan a través de sp_executesql.

1
declare @sql varchar(1000) 
set @sql="select * into #t from table;" 
set @sql [email protected] + "select * from #t;" 

execute SP_EXECUTESQL @sql 
4

En la cadena de @sql, no inserte into #TempTable. En su lugar, llame a su declaración SELECT sin una declaración INSERT.

Por último, insertar los resultados en su tabla temporal de este modo:

INSERT INTO @tmpTbl EXEC sp_executesql @sql 
Cuestiones relacionadas