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.
su tabla temporal en SQL dinámico está fuera del alcance en la parte de SQL no dinámico.
Mire aquí cómo lidiar con esto: Un poco acerca de las tablas temporales locales del servidor SQL
declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"
execute SP_EXECUTESQL @sql