2008-10-03 14 views
14

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.

+0

Si está trabajando en Sybase, ¿por qué ypou etiquetó la pregunta con mysql? –

+0

FYI Sybase es una * compañía * no es un producto de base de datos. ¿Estás hablando de ASE, SQL Anywhere o Sybase IQ? –

+0

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

Respuesta

1
No

seguro acerca de Sybase, pero en SQL Server la siguiente debería funcionar:

INSERT INTO #tmp (col1, col2, col3 ...) my_stp ejecutivo

+1

Gracias Valerion. Eso no funciona en sybase. – user21246

1

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.

3

En Sybase SQL Anywhere,

INSERT INTO #tmp (col1,col2,col3...) select * from my_stp() 
+0

No funciona en isql :( – Arkadiy

7

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 
5

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:

  • "bucle invertido" es el equivalente de Sybase de localhost, pero se puede sustituir para 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 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 
+1

Debe ser '_timestamp' en lugar de' _extractTimestamp' en la instrucción select. Tiene que coincidir con la columna definida en 'create existing table'. – jack3694078

+0

Actualizado, gracias. –

0

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 
Cuestiones relacionadas