estoy trabajando en Sybase ASE 15. Buscando algo como esto¿Cómo puedo obtener datos de un procedimiento almacenado en una tabla temporal?
Select * into #tmp exec my_stp;
my_stp regresa 10 filas de datos con dos columnas en cada fila.
estoy trabajando en Sybase ASE 15. Buscando algo como esto¿Cómo puedo obtener datos de un procedimiento almacenado en una tabla temporal?
Select * into #tmp exec my_stp;
my_stp regresa 10 filas de datos con dos columnas en cada fila.
seguro acerca de Sybase, pero en SQL Server la siguiente debería funcionar:
INSERT INTO #tmp (col1, col2, col3 ...) my_stp ejecutivo
Gracias Valerion. Eso no funciona en sybase. – user21246
No indicar si' El procedimiento re almacenado devuelve más de un valor. Si sólo devuelve un valor a continuación, 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 de valor, entonces tendrá que definir las variables de salida en el sp. Desde el 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 ser definido como una variable de salida en el procedimiento almacenado y en las declaraciones que llaman La palabra clave de salida puede abreviarse como fuera Exec. myproc @a = @myvara out, @b = @myvarb out "
No dices en qué versión de sybase estás trabajando. Todo lo anterior es válido para ASE 12.5.
En Sybase SQL Anywhere,
INSERT INTO #tmp (col1,col2,col3...) select * from my_stp()
No funciona en isql :( – Arkadiy
En ASE 15 Creo que se puede utilizar funciones, pero no vamos a ayudar con conjuntos de datos de varias filas.
Si su proceso almacenado está devolviendo datos con "select col1, col2 from somewhere", entonces no hay forma de capturar esos datos, solo 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
La 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
yo sólo he enfrentado a este problema, y más vale tarde que nunca ...
Es factible, pero un dolor enorme en el culo , involucrando un Sybase "proxy table" que es un soporte 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.
Digamos que haya un procedimiento almacenado definido como:
create procedure mydb.mylogin.sp_extractSomething (
@timestamp datetime) as
select column_a, column_b
from sometable
where timestamp = @timestamp
primer interruptor a la tempdb:
use tempdb
continuación, crear una tabla proxy donde las columnas coinciden 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 destacados:
A continuación, puede seleccionar en la tabla como ésta desde su propia db:
declare @myTimestamp datetime
set @myTimestamp = getdate()
select *
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp
que es bastante sencillo. Para insertar a continuación en una tabla temporal, primero lo crea:
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
Debe ser '_timestamp' en lugar de' _extractTimestamp' en la instrucción select. Tiene que coincidir con la columna definida en 'create existing table'. – jack3694078
Actualizado, gracias. –
Si my_stp está poblando de datos por valores de diferentes tablas de cálculo, puede crear una vista equivalente que hace 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
Si está trabajando en Sybase, ¿por qué ypou etiquetó la pregunta con mysql? –
FYI Sybase es una * compañía * no es un producto de base de datos. ¿Estás hablando de ASE, SQL Anywhere o Sybase IQ? –
Siento tu dolor. En ASE, parece que no hay una solución fácil para esto. Modifique el s/p o recíclelo en línea. Pensé que había una manera de ejecutar una s/p "en" una tabla temporal (¡SIN modificar la s/p!), Pero no puedo encontrarla. *** Los chicos de Sybase necesitan ser derrotados con un manual de PostgreSQL o algo así, supongo. Drat, para duplicar una s/p inútil, supongo. *** Realmente me gustaría saber si esto alguna vez se resuelve (fuera de SQL Anywhere). – Roboprog