15

Am working on sybase ASE 15. Looking for something like this

Select * into #tmp exec my_stp;

my_stp returns 10 data rows with two columns in each row.

Danny Beckett
  • 20,529
  • 24
  • 107
  • 134
user21246
  • 1,774
  • 3
  • 15
  • 15
  • If you are working on Sybase why did ypou tag the question with mysql? – Bartosz Blimke Oct 03 '08 at 09:30
  • FYI Sybase is a *company* not a database product. Are you talking about ASE, SQL Anywhere, or Sybase IQ? – Graeme Perrow Oct 03 '08 at 17:21
  • I feel your pain. Under ASE, there seems to be no easy solution to this. You either modify the s/p, or recreate it inline. I thought there was a way to run an s/p "into" a temp table (WITHOUT modifying the s/p!), but I cannot find it. *** The guys at Sybase need to be beaten with a PostgreSQL manual or something, I guess. Drat, off to duplicate an otherwise useless s/p I guess. *** I would really like to know if this ever gets solved (outside of SQL Anywhere). – Roboprog Nov 25 '09 at 19:35

4 Answers4

6

In ASE 15 I believe you can use functions, but they're not going to help with multirow datasets.

If your stored proc is returning data with a "select col1,col2 from somewhere" then there's no way of grabbing that data, it just flows back to the client.

What you can do is insert the data directly into the temp table. This can be a little tricky as if you create the temp table within the sproc it is deleted once the sproc finishes running and you don't get to see the contents. The trick for this is to create the temp table outside of the sproc, but to reference it from the sproc. The hard bit here is that every time you recreate the sproc you must create the temp table, or you'll get "table not found" errors.


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

The to run the code:


create table #mine
(col1 varchar(3),
col2 varchar(3))
go

exec my_stp
go

select * from #mine
drop table #mine
go
AdamH
  • 1,331
  • 7
  • 19
  • bad form....the idea is to not have a "hidden" table within a SProc....the SProc returns a result set and is captured within a temp table. – GoldBishop Jul 18 '18 at 12:41
  • When I answered this 10 years ago I wasn't aware of any way of doing this. Maybe you can supply a relevant answer to the question that elaborates on your proposal of "the sproc returns a result set and is captured within a temp table"? – AdamH Jul 23 '18 at 04:55
5

I've just faced this problem, and better late than never...

It's doable, but a monstrous pain in the butt, involving a Sybase "proxy table" which is a standin for another local or remote object (table, procedure, view). The following works in 12.5, newer versions hopefully have a better way of doing it.

Let's say you have a stored proc defined as:

create procedure mydb.mylogin.sp_extractSomething (
@timestamp datetime) as
select column_a, column_b
    from sometable
    where timestamp = @timestamp

First switch to the tempdb:

use tempdb

Then create a proxy table where the columns match the result set:

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"

Points of note:

  • "loopback" is the Sybase equivalent of localhost, but you can substitute it for any server registered in the server's sysservers table.
  • The _timestamp parameter gets translated to @timestamp when Sybase executes the stored proc, and all parameter columns declared like this must be defined as null.

You can then select from the table like this from your own db:

declare @myTimestamp datetime
set @myTimestamp = getdate()

select * 
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp

Which is straightforward enough. To then insert into a temporary table, create it first:

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)
)

and combine:

insert into #myTempExtract (column_a, column_b)
select column_a, column_b
    from tempdb..myproxy_extractSomething
    where _timestamp = @myTimestamp
Jakub Korab
  • 4,974
  • 2
  • 24
  • 34
  • 1
    It should be `_timestamp` instead of `_extractTimestamp` in the select statement. It has to match the column defined in `create existing table`. – jack3694078 May 13 '16 at 03:12
-1

Not sure about Sybase, but in SQL Server the following should work:

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

Valerion
  • 823
  • 8
  • 15
-1

If my_stp is populating data by computing values from different tables, you can create an equivalent view which does exactly the same as my_stp.

CREATE VIEW My_view
 AS
/*
  My_stp body
*/


Then select data from view 
SELECT *  INTO #x FROM my_view
  • The overhead created by this is not ideal or efficient....using this pattern will result in severe performance issues when data-sets become very large. – GoldBishop Jul 18 '18 at 12:57