Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   recuperar tabla temporal creada por procedimiento alamcenado (https://www.clubdelphi.com/foros/showthread.php?t=85479)

richy08 22-03-2014 20:36:52

recuperar tabla temporal creada por procedimiento alamcenado
 
Buenos dias compañeros , el dia de hoy me surgio una duda, que no se si es posible hacer, tengo un procedimiento almacenado en mssql 2005 , que crea una tabla temporal (#vacioreserve) e inserta alguna informacion, existe alguna manera de regresar los datos almacenados en esa tabla temporal a delphi 7

Código SQL [-]
CREATE TABLE #vacioreserve ( indes int NULL,acode int NULL,snompro varchar(30) NULL, darrivaldate datetime NULL,ddeparturedate datetime NULL,aowner int NULL,   
bconser varchar(10) NULL, scodepro varchar(10)  NULL, scodeloco varchar(10)  NULL,  sdev varchar(5) NULL, numero int null);
 .
 .
 .
 . 
set @vsql = 'set @cursor = CURSOR local FAST_FORWARD   for ' + @vquery + ' open @cursor;'   
exec sys.sp_executesql @vsql ,N'@cursor cursor output' ,@Qry_acode output  
fetch next from @Qry_acode into @acode, @snompro, @numero, @scodedev, @ownercode, @stype , @slocationcode while (@@fetch_status = 0) begin         

select @acoderec=isnull(max(acode),0) from #vacioreserve ;
insert into #vacioreserve (indes ,acode ,snompro ,darrivaldate, ddeparturedate ,aowner ,  
bconser , scodepro, scodeloco ,  sdev , numero)      values (@acode, @acoderec+1, @snompro , @arrival,  @departuredate, @ownercode , 'Y',  @stype  , 
@slocationcode    , @scodedev ,@numero) ;

fetch next from @Qry_acode into @acode, @snompro, @numero, @scodedev, @ownercode, @stype , @slocationcode  end



Código Delphi [-]
sp_generar.close;
 . 
. 
 sp_generar.open;   
select * from #vacioreserve
gracias por cualquier comentario

olbeup 22-03-2014 21:36:47

Hola richy08,

Una tabla temporal no se puede recuperar porque es temporal, una vez que se cierra la conexión la tabla temporal se destruye automáticamente.

Crea una tabla auxiliar no temporal y cuando ya no la necesites la destruyes.

Un saludo.

Neftali [Germán.Estévez] 24-03-2014 10:33:41

Creo recordar que en SQlServer hay dos tipos de tablas temporales; Las que se crean con # y las que se crean con ## (ahora no recuerdo cual de ellas se puede acceder utilizando la misma conexión con la que se ha creado).
Yo creo que si las tablas temporales las creas utilizando la misma conexión con la que has lanzado el Stored Proc es posible que sí puedas acceder a ellas.
Pero en este caso, lo más sencillo es probarlo.

richy08 24-03-2014 16:36:55

Gracias a los dos por sus respuestas, las tablas temporales que son creadas con "##" son tablas globales y cualquiera aplicacion que cree una conexion puede acceder a ella, en cambio las tablas temporales creadas con "#" solo se pueden acceder desde la mimsma conexion, les cuento un poco mas el probelma, no puedo utilizar una tabla auxiliar para almacenar los datos , por que esos datos crean una grafica de gannt de reservaciones, y esta pantalla es usada por varias personas, al usar una tabla auxiliar se sobreescribirian los datos mostrando errores , y esto que menciona neftali es lo que se me hace mas extraño

Yo creo que si las tablas temporales las creas utilizando la misma conexión con la que has lanzado el Stored Proc es posible que sí puedas acceder a ellas.
Pero en este caso, lo más sencillo es probarlo


por que asi lo hace, el procedimiento almacenado que esta colgado de la misma conexion que le query, primero crea la tabla temporal y luego trato de recuperarla, pero siempre sucede el mismo error, la tabla #reserve no existe o no tiene permisos sobre ella, se me olvido comentar estoy utilizando delphi xe5 y los compnentes de firedac.

mil gracias

olbeup 25-03-2014 08:58:12

Hola richy08,

Cuando creas una tabla #temporal , sólo la estas creando en tú conexión, desde otro ordenador consultas la tabla que has creado temporalmente y no existe, cada ordenador puede crear la misma tabla temporal que para el otro ordenador no existe, sólo para esa conexión.

Cuando creas una tabla ##temporal, todos los usuarios pueden ver la tabla que has creado, pero cuando tú que has creado la tabla cierras la conexión la tabla temporal se destruye y los demás no pueden ver ya la tabla.

Un saludo

richy08 25-03-2014 16:04:23

Cita:

Empezado por olbeup (Mensaje 474308)
Hola richy08,

Cuando creas una tabla #temporal , sólo la estas creando en tú conexión, desde otro ordenador consultas la tabla que has creado temporalmente y no existe, cada ordenador puede crear la misma tabla temporal que para el otro ordenador no existe, sólo para esa conexión.

Cuando creas una tabla ##temporal, todos los usuarios pueden ver la tabla que has creado, pero cuando tú que has creado la tabla cierras la conexión la tabla temporal se destruye y los demás no pueden ver ya la tabla.

Un saludo


Gracias olbeup, estoy totalmente de acuerdo, lo que no entiendo es por que despues de crear la tabla temporal con un procedimiento almacenado, al querer recuperar los datos con un query , la tabla no existe, parece que se destruye al terminar el procedimiento almacenado, en cambio cuando creo la tabla temporal por medio de un query , e intento recuperar los datos por medio de otro query lo hace correctamente :( , nota uso delphi xe5 y los componentes de firedac


saludos

olbeup 26-03-2014 08:55:39

Hola richy08,

Cuando creas una tabla (#temporal, ##temporal) por medio de un procedimiento almacenado, ese procedimiento utiliza una conexión interna el cual cuando termina ese procedimiento la tabla o tablas se destruyen, es como una variable dentro de un procedimiento, no puedes acceder a ella por que no existe, solo existía dentro del procedimiento.

Un saludo.

richy08 26-03-2014 16:31:35

Cita:

Empezado por olbeup (Mensaje 474333)
Hola richy08,

Cuando creas una tabla (#temporal, ##temporal) por medio de un procedimiento almacenado, ese procedimiento utiliza una conexión interna el cual cuando termina ese procedimiento la tabla o tablas se destruyen, es como una variable dentro de un procedimiento, no puedes acceder a ella por que no existe, solo existía dentro del procedimiento.

Un saludo.

a ok, gracias por el tip olbeup, al final cambie todo y termine trabajando con fdmemtable de firedac,

saludos


La franja horaria es GMT +2. Ahora son las 23:42:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi