tipo temporales tablas tabla sp_executesql example ejemplos dinamica crear sql sql-server-2008 tsql sp-executesql temp-tables

temporales - Ejecute sp_executeSql para seleccionar... en#table pero no puede seleccionar datos de tabla temporal



tablas temporales sql server 2016 (8)

Estaba intentando seleccionar ... en una tabla temporal #TempTable en sp_Executedsql. ¿No se insertó con éxito o no, pero hay mensajes escritos (359 filas afectadas) que significan que se insertaron correctamente? Script abajo

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;

Una vez ejecutado, me devuelve los mensajes (359 fila (s) afectadas). Siguiente cuando intente seleccionar los datos de #TempTable.

Select * From #TempTable;

Me vuelve

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

Se sospecha que solo funciona la sección ''seleccionar''. El inserto no funciona. como arreglarlo


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 usar el código de llamada de forma asíncrona.

Se puede usar una tabla temporal local si se definió antes de llamar a sp_executesql, por ejemplo

CREATE TABLE #tempTable(id int); sp_executesql ''INSERT INTO #tempTable SELECT myId FROM myTable''; SELECT * FROM #tempTable;


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

Finalmente, inserte los resultados en su tabla temporal así:

INSERT INTO @tmpTbl EXEC sp_executesql @sql

Además, deberá declarar la tabla temporal si utiliza este enfoque

DECLARE @tmpTbl TABLE ( //define columns here... )


Esto funciono para mi

declare @sql nvarchar(max) create table #temp ( listId int, Name nvarchar(200)) set @sql = ''SELECT top 10 ListId, Name FROM [V12-ListSelector].[dbo].[List]'' insert into #temp exec sp_executesql @sql select * from #temp drop table #temp


La tabla temporal local #table_name es visible solo en la sesión actual, las tablas globales globales ##table_name son visibles en todas las sesiones. Ambos viven hasta que se cierra su sesión. sp_executesql : crea su propia sesión (tal vez la palabra "alcance" sería mejor) y por eso sucede.


Las tablas temporales solo viven mientras la conexión que las crea. Espero que se emita 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 solo asegúrese de pasar el objeto de conexión a su selección.


Para solucionar este problema, use primero el comando CREATE TABLE #TEMPTABLE para generar una tabla temporal vacía antes de ejecutar sp_executesql. Luego ejecute INSERT INTO #TEMPTABLE con sp_executesql. Esto funcionará. Así es como soluciono este problema, ya que tengo una configuración en la que todas mis consultas se ejecutan a través de sp_executesql.



declare @sql varchar(1000) set @sql="select * into #t from table;" set @sql =@sql + "select * from #t;" execute SP_EXECUTESQL @sql