Как я могу получить данные из хранимой процедуры в таблицу 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