Как я могу получить данные из хранимой процедуры в таблицу temp?

Я работаю над sybase ASE 15. Ищете что-то вроде этого

Select * into #tmp exec my_stp;

my_stp возвращает 10 строк данных с двумя столбцами в каждой строке.

Ответы

Ответ 1

В ASE 15 я считаю, что вы можете использовать функции, но они не помогут в многопользовательских наборах данных.

Если ваш сохраненный proc возвращает данные с "select col1, col2 откуда-то", тогда нет способа захватить эти данные, он просто возвращается к клиенту.

Что вы можете сделать, так это вставить данные непосредственно в таблицу temp. Это может быть немного сложно, как если бы вы создали временную таблицу в sproc, она удаляется, когда sproc завершается, и вы не можете увидеть содержимое. Хитрость для этого заключается в создании таблицы temp вне sproc, но для ссылки на нее из sproc. Жесткий бит здесь заключается в том, что каждый раз, когда вы воссоздаете sproc, вы должны создать временную таблицу, или вы получите ошибки "table not found".


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

Для запуска кода:


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

exec my_stp
go

select * from #mine
drop table #mine
go

Ответ 2

Я только что столкнулся с этой проблемой, и лучше поздно, чем никогда...

Это выполнимо, но чудовищная боль в прикладе, включающая Sybase " прокси-таблица", которая является standin для другого локального или удаленного объекта (таблица, процедура, вид). Следующие работы в 12.5, более новые версии, надеюсь, имеют лучший способ сделать это.

Скажем, у вас есть хранимая процедура, определенная как:

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

Сначала переключитесь на tempdb:

use tempdb

Затем создайте прокси-таблицу, в которой столбцы соответствуют набору результатов:

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"

Точки обзора:

  • "loopback" - эквивалент Sybase локального хоста, но вы можете заменить это для любого сервера, зарегистрированного в сервер sysservers.
  • Параметр _timestamp преобразуется в @timestamp, когда Sybase выполняет хранимый процесс, и все столбцы параметров, объявленные как это, должны быть определены как null.

Затем вы можете выбрать из таблицы, как это, из своего собственного db:

declare @myTimestamp datetime
set @myTimestamp = getdate()

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

Это достаточно просто. Чтобы затем вставить во временную таблицу, сначала создайте ее:

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

и объединить:

insert into #myTempExtract (column_a, column_b)
select column_a, column_b
    from tempdb..myproxy_extractSomething
    where _timestamp = @myTimestamp

Ответ 3

В Sybase SQL Anywhere,

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

Ответ 4

Не уверен в Sybase, но в SQL Server должно работать следующее:

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

Ответ 5

Вы не указываете, возвращает ли вы хранимую процедуру более одного значения. Если он возвращает только одно значение, вы можете сделать следующее:

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

Если ваш sp возвращает больше, чем значение, тогда вам нужно будет определить выходные переменные в sp. Из руководства по сибасе http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072

"Хранимая процедура может возвращать несколько значений, каждая из которых должна быть определена как выходная переменная в хранимой процедуре и в вызывающих операторах. Ключевое слово вывода может быть сокращено до значения. exec myproc @a = @myvara out, @b = @myvarb out

Вы не говорите, какую версию sybase вы работаете. Все вышеизложенное относится к ASE 12.5.

Ответ 6

Если my_stp заполняет данные, вычисляя значения из разных таблиц, вы можете создать эквивалентное представление, которое будет точно таким же, как my_stp.

CREATE VIEW My_view
 AS
/*
  My_stp body
*/


Then select data from view 
SELECT *  INTO #x FROM my_view