Как я могу получить данные из хранимой процедуры во временную таблицу? - PullRequest
14 голосов
/ 03 октября 2008

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

Select * into #tmp exec my_stp;

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

Ответы [ 5 ]

6 голосов
/ 06 октября 2008

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

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

Что вы можете сделать, это вставить данные непосредственно во временную таблицу. Это может быть немного сложнее, как если бы вы создали временную таблицу внутри sproc, она удаляется, как только sproc завершит работу, и вы не увидите содержимое. Хитрость для этого заключается в том, чтобы создать временную таблицу вне sproc, но ссылаться на нее из sproc. Сложность в том, что каждый раз, когда вы воссоздаете sproc, вы должны создать временную таблицу, иначе вы получите ошибки «таблица не найдена».


    --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
5 голосов
/ 06 апреля 2011

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

Это выполнимо, но чудовищная боль в заднице, связанная с " прокси-таблицей Sybase ", которая заменяет другой локальный или удаленный объект (таблица, процедура, представление). Следующее работает в 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 из localhost, но вы можете заменить это для любого сервера, зарегистрированного в таблица системных серверов.
  • Параметр _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
0 голосов
/ 18 марта 2019

Оказывается, что процедуру можно просто рассматривать как таблицу , например:

DECLARE LOCAL TEMPORARY TABLE tblLocks(connId INT);
INSERT INTO tblLocks
SELECT conn_id
FROM sa_locks() -- add () after the procedure name

Я также пробовал определенные пользователем процедуры с SQL Anywhere 16 , работает так же.

0 голосов
/ 30 августа 2014

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

CREATE VIEW My_view
 AS
/*
  My_stp body
*/


Then select data from view 
SELECT *  INTO #x FROM my_view
0 голосов
/ 03 октября 2008

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

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

...