sybase-ase - temporales - procedimiento almacenado sql server select
¿Cómo puedo obtener datos de un procedimiento almacenado en una tabla temporal? (6)
Estoy trabajando en Sybase ASE 15. Buscando algo como esto
Select * into #tmp exec my_stp;
my_stp devuelve 10 filas de datos con dos columnas en cada fila.
En Sybase SQL Anywhere,
INSERT INTO #tmp (col1,col2,col3...) select * from my_stp()
No estoy seguro acerca de Sybase, pero en SQL Server lo siguiente debería funcionar:
INSERT INTO #tmp (col1, col2, col3 ...) exec my_stp
No indica si su procedimiento almacenado devuelve más de un valor. Si solo devuelve un valor, puede hacer lo siguiente:
--create store procedure
create procedure sp_returnOne
as
BEGIN
return 1
END
--create temp table
create table #tt (
col1 int null
)
--populate temp table #tt with stored procedure
declare @result int
exec @result = sp_returnOne
insert into #tt values (@result)
select * from #tt
drop table #tt
Si su sp devuelve más que valor, entonces tendrá que definir las variables de salida en sp. Del manual de sybase http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072
"Un procedimiento almacenado puede devolver varios valores, cada uno debe definirse como una variable de salida en el procedimiento almacenado y en las instrucciones de llamada. La palabra clave de salida se puede abreviar como out. Exec myproc @a = @myvara out, @b = @myvarb fuera"
No dices en qué versión de sybase estás trabajando. Todo lo anterior es válido para ASE 12.5.
En ASE 15 creo que puede usar funciones, pero no van a ayudar con conjuntos de datos multirrutas.
Si el proceso almacenado está devolviendo datos con un "select col1, col2 from somewhere", entonces no hay forma de captar esos datos, simplemente fluye de regreso al cliente.
Lo que puede hacer es insertar los datos directamente en la tabla temporal. Esto puede ser un poco complicado, ya que si creas la tabla temporal dentro del sproc, se elimina una vez que el sproc termina de ejecutarse y no puedes ver el contenido. El truco para esto es crear la tabla temporal fuera del sproc, pero hacer referencia a ella desde el sproc. Lo difícil aquí es que cada vez que recreas el sproc debes crear la tabla temporal, o obtendrás errores de "tabla no encontrada".
--You must use this whole script to recreate the sproc
create table #mine
(col1 varchar(3),
col2 varchar(3))
go
create procedure my_stp
as
insert into #mine values("aaa","aaa")
insert into #mine values("bbb","bbb")
insert into #mine values("ccc","ccc")
insert into #mine values("ccc","ccc")
go
drop table #mine
go
Para ejecutar el código:
create table #mine
(col1 varchar(3),
col2 varchar(3))
go
exec my_stp
go
select * from #mine
drop table #mine
go
Si my_stp está rellenando datos calculando valores de diferentes tablas, puede crear una vista equivalente que haga exactamente lo mismo que my_stp.
CREATE VIEW My_view
AS
/*
My_stp body
*/
Then select data from view
SELECT * INTO #x FROM my_view
Acabo de enfrentar este problema, y mejor tarde que nunca ...
Es factible, pero un dolor monstruoso en el trasero, que involucra una " tabla de proxy " de Sybase que es una plataforma para otro objeto local o remoto (tabla, procedimiento, vista). Los siguientes trabajos en 12.5, versiones más nuevas, con suerte, tienen una mejor manera de hacerlo.
Supongamos que tiene un proceso almacenado definido como:
create procedure mydb.mylogin.sp_extractSomething (
@timestamp datetime) as
select column_a, column_b
from sometable
where timestamp = @timestamp
Primero cambie al tempdb:
use tempdb
Luego, cree una tabla proxy donde las columnas coincidan con el conjunto de resultados:
create existing table myproxy_extractSomething (
column_a int not null, -- make sure that the types match up exactly!
column_b varchar(20) not null,
_timestamp datetime null,
primary key (column_a)) external procedure at "loopback.mydb.mylogin.sp_extractSomething"
Puntos de nota:
- "loopback" es el equivalente de Sybase de localhost, pero puede sustituirlo por cualquier servidor registrado en la tabla sysservers del servidor.
- El parámetro _timestamp se traduce a @timestamp cuando Sybase ejecuta el proceso almacenado, y todas las columnas de parámetros declaradas así deben definirse como nulas.
A continuación, puede seleccionar de la tabla como esta desde su propio db:
declare @myTimestamp datetime
set @myTimestamp = getdate()
select *
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp
Lo cual es bastante sencillo. Para luego insertarlo en una tabla temporal, créelo primero:
create table #myTempExtract (
column_a int not null, -- again, make sure that the types match up exactly
column_b varchar(20) not null,
primary key (column_a)
)
y combinar:
insert into #myTempExtract (column_a, column_b)
select column_a, column_b
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp