una temporales tablas tabla stored resultado procedimientos procedimiento insertar guardar crear almacenados almacenado sybase-ase

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