2008-10-03 10 views
14

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.

+0

Jeśli pracujesz nad Sybase, dlaczego ypou oznaczył pytanie za pomocą mysql? –

+0

FYI Sybase jest * firmą * nie jest produktem bazodanowym. Czy mówisz o ASE, SQL Anywhere lub Sybase IQ? –

+0

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

Odpowiedz

1

Nie wiesz o Sybase, ale w SQL Server dodaje powinno działać:

wstawić do #tmp (col1, col2, Col3 ...) exec my_stp

+1

Dzięki Valerion. To nie działa w sybase. – user21246

1

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.

3

W Sybase SQL Anywhere,

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

Nie działa pod isql :( – Arkadiy

7

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 
5

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:

  • „sprzężenia zwrotnego” jest odpowiednikiem Sybase z localhost, ale można zastąpić to dla dowolnego serwera zarejestrowanego w sysservers stołu serwującego .
  • Parametr _timestamp zostaje przetłumaczony na @timestamp, gdy Sybase wykonuje przechowywany proces, a wszystkie kolumny parametrów zadeklarowane w ten sposób muszą być zdefiniowane jako null.

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

Powinien być '_timestamp' zamiast' _extractTimestamp' w instrukcji select.Musi pasować do kolumny zdefiniowanej w 'create existing table'. – jack3694078

+0

Zaktualizowany, dziękuję. –

0

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 
Powiązane problemy