2009-09-18 13 views
6

Il mio DBA mi ha costruito una stored procedure in un database Sybase, per il quale non ho la definizione. Se lo eseguo, restituisce un set di risultati con un insieme di colonne e valori. Vorrei SELEZIONARE ulteriormente per ridurre le righe nel set di risultati. È possibile?Come si seleziona da una stored procedure in Sybase?

Da this question sembra possibile inserire i risultati in una tabella temporanea, ma non sono sicuro di avere le autorizzazioni per farlo.

C'è un modo per selezionare determinate righe o, in caso contrario, qualcuno può fornirmi un codice di esempio per la simulazione con una tabella temporanea?

risposta

2

È necessario chiedere al DBA di modificare la procedura memorizzata.

Si potrebbe avere cambiato per selezionare i risultati in una rater tabella temporanea di un semplice selezionare e poi si può scrivere il proprio selezionare su quella tabella temporanea di restituire solo le righe che si desidera

2

Per quanto ne so, questo non è possibile in Sybase ASE. Anche usando

insert #temp_table 
exec my_procedure 

non funziona (almeno su sybase 12.x).

2

Sotto Sybase IQ (12.6 e superiore almeno) è possibile selezionare da una stored procedure e filtrare i risultati come se fosse una tabella. Non so se funziona in ASE o ASA ma potresti provare.

Quindi se la stored procedure è denominata myproc, il set di risultati ha una colonna ACTIVE che può essere 0 o 1 e si desidera selezionare solo ACTIVE = 1 righe.

SELECT * FROM myproc() dove ACTIVE = 1

Sotto IQ è anche possibile utilizzare questo come una tabella derivata e si uniscono con altri tavoli per esempio come questo ...

SELEZIONA t1.name , t1.address, t2, attiva da T1 tbl_atable, (SELECT * FROM myproc() dove ACTIVE = 1) t2 DOVE t1.active = t2.active

... che è una specie di pulito!

Spero che funzioni per qualsiasi versione di Sybase in esecuzione.

2

E 'possibile con ASE ma in un modo piuttosto indiretto usando le tabelle CIS e proxy. Il meccanismo è descritto molto bene sul sito di Rob Verschoor:

http://www.sypron.nl/proctab.html

ho provato una volta come una curiosità e in effetti funziona. Non ho approfondito la questione delicata della gestione degli errori.

pjjH

+0

Grazie, funziona. Sybase ASE è molto forte. –

3

In Sybase ASE, possiamo usare questo hack per selezionare da una stored procedure tramite una tabella di "proxy":

http://www.sypron.nl/proctab.html

Esempio:

sp_addserver loopback, null, @@servername 
go 

create existing table 
sp_test12 (
    Document_Name varchar(100), 
    Required_Status varchar(5), 
    Doc_ID varchar(10), 
    OrderBy int, 
    No_of_Copy_Retain int, 
    _p_EPEB_ID varchar(10) null, 
    _p_MY_NAME varchar(3) null, 
    _p_MY_NO varchar(10) null, 
    _p_EPEB_EDATE datetime null, 
    _TXN varchar(10) null, 
    _SUBTXN varchar(15) null, 
    _OwnType_ID1 varchar(5) null, 
    _OwnType_ID2 varchar(5) null, 
    _blnflag int null 
) 
external procedure 
at 'loopback.MYDB.dbo.usp_xyz' 
go 

select 
Doc_ID, No_of_Copy_Retain, _p_EPEB_ID, _p_EPEB_ID, _p_MY_NAME, _p_MY_NO 
from #sp_test12 
where 
    _p_EPEB_ID='EPEB1508' 
    and _p_MY_NAME='107' 
    and _p_MY_NO='2011000045' 
    and _p_EPEB_EDATE='2011-01-15 15:03:03.0' 
    and _TXN='TX012' 
    and _SUBTXN='TX012.001' 
    and _OwnType_ID1='ASSN' 
    and _OwnType_ID2='ASSN' 
    and _blnflag=0 
go 
+1

Questo funziona. Sybase è matto. –

1

Proprio un pensiero.

Forse il tuo DBA potrebbe preparare una vista invece di una procedura memorizzata, se ti volesse per qualche motivo non guardare le cose interne o preoccuparti di ciò.

Un altro approccio sarebbe vedere il testo della stored procedure (a meno che non sia crittografato) con sp_helptext e riscriverlo per i propri scopi (ad esempio in una vista) per essere in grado di applicare condizionamenti aggiuntivi al set di risultati.

0

In Sybase IQ, si può fare questo:

selezionare < col1>, < col2> da < sp_name> ('< sp_arg>') dove < predicato>

Esempio:

selezionare oggetto, DbspaceName, ObjSize da sp_iqindexinfo ('tabella xyz') dove oggetto come '% col1_indx%'

Problemi correlati