Leer tabla temporal en procedimiento almacenado.

10/11/2003 - 20:56 por Tomás | Informe spam
Hola a todo el grupo.

Tengo un problema que no consigo resolver. Necesito leer los datos de un
procedimiento almacenado que se ejecuta en un servidor SQL Server 2000 que,
después de muchas funciones, me devuelve el resultado guardado en una tabla
temporal de la siguiente forma:

SELECT * FROM #TEMP

Desde mi aplicación en VC++.NET, utilizo ADO, (resumido), de la siguiente
forma:

_ConnectionPtr pConn;
_RecordsetPtr pRset;
_CommandPtr pCommand;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = pConn;
pCommand->CommandText = "MiProcedimiento";
pCommand->CommandType = adCmdStoredProc;
pRset = pCommand->Execute(NULL,NULL,adCmdStoredProc);

Este conjunto de datos (pRset), no contiene nada cuando regresa de ejecutar
la consulta al procedimiento almacenado.

Sin embargo, si el procedimiento almacenado es un SELECT a una tabla que
exista en la base de datos, funciona perfectamente, este ejemplo funciona:

SELECT * FROM MI_TABLA

El problema que tengo es que necesito hacer muchos trabajos de selección de
muchas tablas, que se resumen en una temporal y luego hacer un solo SELECT
de esta tabla temporal que es la que utilizo en mi aplicación.

¿Alguien sabe como se puede conseguir leer los datos de un procedimiento
almacenado que devuelve los datos de una tabla temporal?.

Gracias por anticipado.

Tomás.

Preguntas similare

Leer las respuestas

#1 Diego Uribe
11/11/2003 - 16:51 | Informe spam
Ensaya a leerla no con #temp sino con ##temp

Deberia funcionar!

Diego


"Tomás" escribió en el mensaje
news:
Hola a todo el grupo.

Tengo un problema que no consigo resolver. Necesito leer los datos de un
procedimiento almacenado que se ejecuta en un servidor SQL Server 2000


que,
después de muchas funciones, me devuelve el resultado guardado en una


tabla
temporal de la siguiente forma:

SELECT * FROM #TEMP

Desde mi aplicación en VC++.NET, utilizo ADO, (resumido), de la siguiente
forma:

_ConnectionPtr pConn;
_RecordsetPtr pRset;
_CommandPtr pCommand;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = pConn;
pCommand->CommandText = "MiProcedimiento";
pCommand->CommandType = adCmdStoredProc;
pRset = pCommand->Execute(NULL,NULL,adCmdStoredProc);

Este conjunto de datos (pRset), no contiene nada cuando regresa de


ejecutar
la consulta al procedimiento almacenado.

Sin embargo, si el procedimiento almacenado es un SELECT a una tabla que
exista en la base de datos, funciona perfectamente, este ejemplo funciona:

SELECT * FROM MI_TABLA

El problema que tengo es que necesito hacer muchos trabajos de selección


de
muchas tablas, que se resumen en una temporal y luego hacer un solo SELECT
de esta tabla temporal que es la que utilizo en mi aplicación.

¿Alguien sabe como se puede conseguir leer los datos de un procedimiento
almacenado que devuelve los datos de una tabla temporal?.

Gracias por anticipado.

Tomás.


Respuesta Responder a este mensaje
#2 Eladio Rincón
11/11/2003 - 22:55 | Informe spam
Hola Tomás,

el ámbito de las tablas locales (creadas con #) temporales creadas dentro de un procedimiento es local al procedimiento es decir no se verá desde fuera de el; mira este ejemplo:

create proc foo11
as

select *
into #tmp
from Orders

si ejecutas:
exec foo11

verás en la ventana de resultado el mensaje 830 filas afectadas; sin embargo si intentas recupera el contenido de la tabla :
select * from #tmp
te mostrará el mensaje de que la tabla no existe;

Como bien dices, dentro del procedimiento haces una serie de procesos que vas guardando en las tablas temporales, para ello podrías hacerlo así:

create proc foo22
as

select *
into #tmp
from Orders


select *
from #tmp

go

si ejecutas:
exec foo22
si te devolverá el resultado.


También podrías usar tablas temporales globales:
create proc foo33
as

select *
into ##tmp
from Orders

go

exec foo33

aquí si podrías ver el resultado consultando la tabla global:
select * from ##tmp

sin embargo no te recomiendo hacerlo con tablas temporales globales porque el procedimiento puede ser llamado varias veces por distintos usuarios y el resultado no sería correcto.

Espero que te sirva,



Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Tomás" escribió en el mensaje news:
Hola a todo el grupo.

Tengo un problema que no consigo resolver. Necesito leer los datos de un
procedimiento almacenado que se ejecuta en un servidor SQL Server 2000 que,
después de muchas funciones, me devuelve el resultado guardado en una tabla
temporal de la siguiente forma:

SELECT * FROM #TEMP

Desde mi aplicación en VC++.NET, utilizo ADO, (resumido), de la siguiente
forma:

_ConnectionPtr pConn;
_RecordsetPtr pRset;
_CommandPtr pCommand;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = pConn;
pCommand->CommandText = "MiProcedimiento";
pCommand->CommandType = adCmdStoredProc;
pRset = pCommand->Execute(NULL,NULL,adCmdStoredProc);

Este conjunto de datos (pRset), no contiene nada cuando regresa de ejecutar
la consulta al procedimiento almacenado.

Sin embargo, si el procedimiento almacenado es un SELECT a una tabla que
exista en la base de datos, funciona perfectamente, este ejemplo funciona:

SELECT * FROM MI_TABLA

El problema que tengo es que necesito hacer muchos trabajos de selección de
muchas tablas, que se resumen en una temporal y luego hacer un solo SELECT
de esta tabla temporal que es la que utilizo en mi aplicación.

¿Alguien sabe como se puede conseguir leer los datos de un procedimiento
almacenado que devuelve los datos de una tabla temporal?.

Gracias por anticipado.

Tomás.


Respuesta Responder a este mensaje
#3 Tomás
13/11/2003 - 07:38 | Informe spam
Gracias por la información.
Trabajaré sobre las distintas formas de tabla temporal y veré como puedo
resolverlo.

Gracias de nuevo y un saludo.

Tomás.

"Eladio Rincón" escribió en el mensaje
news:
Hola Tomás,

el ámbito de las tablas locales (creadas con #) temporales creadas dentro de
un procedimiento es local al procedimiento es decir no se verá desde fuera
de el; mira este ejemplo:

create proc foo11
as

select *
into #tmp
from Orders

si ejecutas:
exec foo11

verás en la ventana de resultado el mensaje 830 filas afectadas; sin embargo
si intentas recupera el contenido de la tabla :
select * from #tmp
te mostrará el mensaje de que la tabla no existe;

Como bien dices, dentro del procedimiento haces una serie de procesos que
vas guardando en las tablas temporales, para ello podrías hacerlo así:

create proc foo22
as

select *
into #tmp
from Orders


select *
from #tmp

go

si ejecutas:
exec foo22
si te devolverá el resultado.


También podrías usar tablas temporales globales:
create proc foo33
as

select *
into ##tmp
from Orders

go

exec foo33

aquí si podrías ver el resultado consultando la tabla global:
select * from ##tmp

sin embargo no te recomiendo hacerlo con tablas temporales globales porque
el procedimiento puede ser llamado varias veces por distintos usuarios y el
resultado no sería correcto.

Espero que te sirva,



Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Tomás" escribió en el mensaje
news:
Hola a todo el grupo.

Tengo un problema que no consigo resolver. Necesito leer los datos de un
procedimiento almacenado que se ejecuta en un servidor SQL Server 2000


que,
después de muchas funciones, me devuelve el resultado guardado en una


tabla
temporal de la siguiente forma:

SELECT * FROM #TEMP

Desde mi aplicación en VC++.NET, utilizo ADO, (resumido), de la siguiente
forma:

_ConnectionPtr pConn;
_RecordsetPtr pRset;
_CommandPtr pCommand;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = pConn;
pCommand->CommandText = "MiProcedimiento";
pCommand->CommandType = adCmdStoredProc;
pRset = pCommand->Execute(NULL,NULL,adCmdStoredProc);

Este conjunto de datos (pRset), no contiene nada cuando regresa de


ejecutar
la consulta al procedimiento almacenado.

Sin embargo, si el procedimiento almacenado es un SELECT a una tabla que
exista en la base de datos, funciona perfectamente, este ejemplo funciona:

SELECT * FROM MI_TABLA

El problema que tengo es que necesito hacer muchos trabajos de selección


de
muchas tablas, que se resumen en una temporal y luego hacer un solo SELECT
de esta tabla temporal que es la que utilizo en mi aplicación.

¿Alguien sabe como se puede conseguir leer los datos de un procedimiento
almacenado que devuelve los datos de una tabla temporal?.

Gracias por anticipado.

Tomás.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida