Am работает на Sybase ASE 15. Ищет что-то вроде этогоКак я могу получить данные из хранимой процедуры в временную таблицу?
Select * into #tmp exec my_stp;
my_stp возвращает 10 строк данных с двумя столбцами в каждой строке.
Am работает на Sybase ASE 15. Ищет что-то вроде этогоКак я могу получить данные из хранимой процедуры в временную таблицу?
Select * into #tmp exec my_stp;
my_stp возвращает 10 строк данных с двумя столбцами в каждой строке.
Не уверен, Sybase, но в SQL Server должно работать:
INSERT INTO #tmp (col1, col2, col3 ...) Exec my_stp
Спасибо Валерион. Это не работает в сибасе. – user21246 2008-10-03 12:26:08
Вы не являются ли вы» 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.
В Sybase SQL Anywhere,
INSERT INTO #tmp (col1,col2,col3...) select * from my_stp()
В 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
Я только столкнулся с этой проблемой, и лучше поздно, чем никогда ...
Это выполнимо, но чудовищная боль в заднице , с использованием 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"
Очковые пункты:
Вы можете выбрать из таблицы, как это с вашей собственной БД:
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
Если my_stp заполняемых данных путем вычисления значений из разных таблиц, вы можете создать эквивалентное представление, которое делает именно то же, что и my_stp.
CREATE VIEW My_view
AS
/*
My_stp body
*/
Then select data from view
SELECT * INTO #x FROM my_view
Если вы работаете над Sybase, почему ypou пометить вопрос mysql? – 2008-10-03 09:30:59
FYI Sybase - это * компания * не продукт базы данных. Вы говорите об ASE, SQL Anywhere или Sybase IQ? – 2008-10-03 17:21:47
Я чувствую вашу боль. В ASE, похоже, нет простого решения. Вы либо модифицируете s/p, либо воссоздаете его в строке. Я думал, что есть способ запустить s/p «в» таблицу temp (БЕЗ модификации s/p!), Но я не могу ее найти. *** Ребята из Sybase должны быть избиты с помощью руководства PostgreSQL или чего-то еще, я думаю. Я думаю, что Дэт, чтобы дублировать иначе бесполезные s/p. *** Я действительно хотел бы знать, будет ли это когда-либо решено (вне SQL Anywhere). – Roboprog 2009-11-25 19:35:03