pracuję na Sybase ASE 15. Patrząc na coś takiegoJak mogę pobrać dane z procedury składowanej do tabeli tymczasowej?
Select * into #tmp exec my_stp;
my_stp zwraca 10 wierszy danych z dwóch kolumn w każdym wierszu.
pracuję na Sybase ASE 15. Patrząc na coś takiegoJak mogę pobrać dane z procedury składowanej do tabeli tymczasowej?
Select * into #tmp exec my_stp;
my_stp zwraca 10 wierszy danych z dwóch kolumn w każdym wierszu.
Nie wiesz o Sybase, ale w SQL Server dodaje powinno działać:
wstawić do #tmp (col1, col2, Col3 ...) exec my_stp
Dzięki Valerion. To nie działa w sybase. – user21246
Nie stwierdzić, czy” procedura ponownie składowana zwraca więcej niż jedną wartość. Jeśli tylko zwraca jedną wartość, a następnie można wykonać następujące czynności:
--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
Jeśli sp zwraca więcej niż wartość wtedy musisz zdefiniować zmienne wyjściowe w sp. z podręcznika sybase http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072
„Procedura przechowywana może zwrócić kilka wartości;. Każdy musi być zdefiniowana jako zmienna wyjściowa w procedurze przechowywanej w sprawozdaniach Wywołanie kluczowe wyjście może być skrócona do out Exec. myproc @a = @myvara out, @b = @myvarb out "
Nie mówisz, na której wersji sybase pracujesz. Wszystkie powyższe są ważne dla ASE 12.5.
W Sybase SQL Anywhere,
INSERT INTO #tmp (col1,col2,col3...) select * from my_stp()
Nie działa pod isql :( – Arkadiy
W ASE 15 Wierzę, że można korzystać z funkcji, ale nie zamierzamy pomóc w zbiorach danych Multirow.
Jeśli przechowywany proc powraca do danych z "wybierz col1, col2 skądś", to nie ma sposobu, aby pobrać te dane, po prostu wraca do klienta.
Co można zrobić, to wstawić dane bezpośrednio do tabeli tymczasowej. Może to być trochę trudne, jak gdybyś utworzył tabelę tymczasową w sprocu, który zostanie usunięty, gdy zakończy się działanie sproc, a ty nie zobaczysz zawartości. W tym celu należy utworzyć tabelę tymczasową poza sprochem, ale odwołać się do niej ze sproc. Najtrudniejsze jest to, że za każdym razem, gdy odtwarzasz sproc, musisz utworzyć tabelę tymczasową, inaczej otrzymasz błąd "nie znaleziono tabeli".
--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
uruchomić kod:
create table #mine
(col1 varchar(3),
col2 varchar(3))
go
exec my_stp
go
select * from #mine
drop table #mine
go
Właśnie w obliczu tego problemu, a lepiej późno niż wcale ...
Jest to wykonalne, ale potworny ból w tyłek , z udziałem Sybase "proxy table", który jest standinem dla innego obiektu lokalnego lub zdalnego (tabela, procedura, widok). Następujące prace w wersji 12.5, nowsze, mam nadzieję, że mają lepszy sposób robienia tego.
Powiedzmy masz przechowywane proc zdefiniowany jako:
create procedure mydb.mylogin.sp_extractSomething (
@timestamp datetime) as
select column_a, column_b
from sometable
where timestamp = @timestamp
najpierw przełączyć na tempdb:
use tempdb
następnie utworzyć tabelę proxy gdzie kolumny dopasować zestaw wyników:
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"
Nuty:
Następnie można wybrać z tabeli jak to z własnego db:
declare @myTimestamp datetime
set @myTimestamp = getdate()
select *
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp
który jest wystarczająco proste. Aby następnie wstawić do tabeli tymczasowej, utwórz go najpierw:
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)
)
i łączyć:
insert into #myTempExtract (column_a, column_b)
select column_a, column_b
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp
Powinien być '_timestamp' zamiast' _extractTimestamp' w instrukcji select.Musi pasować do kolumny zdefiniowanej w 'create existing table'. – jack3694078
Zaktualizowany, dziękuję. –
Jeśli my_stp jest wypełnianie danych poprzez obliczenie wartości z różnych tabel, można utworzyć równoważny widok, który robi dokładnie taki sam jak my_stp.
CREATE VIEW My_view
AS
/*
My_stp body
*/
Then select data from view
SELECT * INTO #x FROM my_view
Jeśli pracujesz nad Sybase, dlaczego ypou oznaczył pytanie za pomocą mysql? –
FYI Sybase jest * firmą * nie jest produktem bazodanowym. Czy mówisz o ASE, SQL Anywhere lub Sybase IQ? –
Czuję twój ból. Pod ASE wydaje się, że nie ma na to łatwego rozwiązania. Możesz zmodyfikować s/p lub odtworzyć go w linii. Pomyślałem, że istnieje sposób uruchomienia s/p "w" tabeli tymczasowej (BEZ modyfikacji s/p!), Ale nie mogę go znaleźć. *** Faceci w Sybase muszą być pobici za pomocą podręcznika PostgreSQL lub czegoś podobnego. Drat, off, aby zduplikować inaczej bezużyteczne s/p, jak sądzę. *** Naprawdę chciałbym wiedzieć, czy to kiedykolwiek zostanie rozwiązane (poza SQL Anywhere). – Roboprog