2008-10-03 13 views
14

Am работает на Sybase ASE 15. Ищет что-то вроде этогоКак я могу получить данные из хранимой процедуры в временную таблицу?

Select * into #tmp exec my_stp; 

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

+0

Если вы работаете над Sybase, почему ypou пометить вопрос mysql? – 2008-10-03 09:30:59

+0

FYI Sybase - это * компания * не продукт базы данных. Вы говорите об ASE, SQL Anywhere или Sybase IQ? – 2008-10-03 17:21:47

+0

Я чувствую вашу боль. В ASE, похоже, нет простого решения. Вы либо модифицируете s/p, либо воссоздаете его в строке. Я думал, что есть способ запустить s/p «в» таблицу temp (БЕЗ модификации s/p!), Но я не могу ее найти. *** Ребята из Sybase должны быть избиты с помощью руководства PostgreSQL или чего-то еще, я думаю. Я думаю, что Дэт, чтобы дублировать иначе бесполезные s/p. *** Я действительно хотел бы знать, будет ли это когда-либо решено (вне SQL Anywhere). – Roboprog 2009-11-25 19:35:03

ответ

1

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

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

+1

Спасибо Валерион. Это не работает в сибасе. – user21246 2008-10-03 12:26:08

1

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

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

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

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

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

3

В Sybase SQL Anywhere,

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

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

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

Что вы можете сделать, это вставить данные непосредственно в таблицу темп. Это может быть немного сложно, как если бы вы создали временную таблицу в 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 
5

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

Это выполнимо, но чудовищная боль в заднице , с использованием Sybase «proxy table», который является 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" 

Очковые пункты:

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

Вы можете выбрать из таблицы, как это с вашей собственной БД:

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

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

CREATE VIEW My_view 
AS 
/* 
    My_stp body 
*/ 


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

 Смежные вопросы

  • Нет связанных вопросов^_^