2009-09-18 18 views
6

Mi DBA me ha construido un procedimiento almacenado en una base de datos Sybase, para la cual no tengo la definición. Si lo ejecuto, devuelve un conjunto de resultados con un conjunto de columnas y valores. Me gustaría SELECCIONAR más para reducir las filas en el conjunto de resultados. es posible?¿Cómo selecciono un procedimiento almacenado en Sybase?

De this question parece que podría insertar los resultados en una tabla temporal, pero no estoy seguro de tener permisos para hacerlo.

¿Hay alguna manera de SELECCIONAR ciertas filas? Si no, ¿alguien me puede dar un código de ejemplo para simular con una tabla temporal?

Respuesta

2

Deberá solicitar al DBA que cambie el procedimiento almacenado.

Se podría conseguir que cambió para seleccionar los resultados en un evaluador tabla temporal de una llanura seleccionar y entonces usted puede escribir su propio seleccionar en que tabla temporal para devolver sólo las filas que desea

2

Por lo que yo sé, esto no es posible en Sybase ASE. Incluso utilizando

insert #temp_table 
exec my_procedure 

no funciona (al menos en sybase 12.x).

2

Bajo Sybase IQ (12,6 y al menos superior) puede seleccionar de un procedimiento almacenado y filtrar los resultados como si fuera una tabla. No sé si esto funciona bajo ASE o ASA, pero podrías intentarlo.

Si el procedimiento almacenado se llama myproc y el conjunto de resultados tiene una columna ACTIVA que puede ser 0 o 1 y desea seleccionar solo las filas ACTIVAS = 1, puede hacerlo.

SELECT * FROM myproc() DONDE ACTIVO = 1

Bajo IQ también se puede utilizar esto como una tabla derivada y unirse con otras tablas, por ejemplo, como esto ...

t1.name SELECT , t1.address, t2, t1 activa dE tbl_atable, (SELECT * FROM myproc() DONDE aCTIVO = 1) t2 = DONDE t1.active t2.active

... que es una especie de limpia!

Espero que funcione para cada versión de Sybase que esté ejecutando.

2

Es posible con ASE pero de una manera bastante indirecta usando CIS y tablas de proxy. El mecanismo se describe muy bien en el sitio de Rob Verschoor:

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

lo probé una vez como una curiosidad y de hecho lo hace el trabajo. No profundicé en la difícil cuestión del manejo de errores.

PJJH

+0

Gracias, funciona. Sybase ASE es loco. –

3

En Sybase ASE, podemos utilizar este truco para seleccionar un procedimiento almacenado a través de una "tabla proxy":

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

Ejemplo:

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

Esto funciona. Sybase es loco. –

1

Justo un pensamiento.

Quizás su DBA podría preparar una vista en lugar de un procedimiento almacenado, si por alguna razón deseaba que no mirara las cosas internas o se preocupara por ello.

Otro enfoque sería ver el texto del procedimiento almacenado (a menos que esté encriptado) con sp_helptext y reescribirlo para sus propios fines (por ejemplo, en una vista) para poder aplicar acondicionamiento adicional al conjunto de resultados.

0

En Sybase IQ, usted puede hacer esto:

seleccione < col1>, < col2> desde < sp_name> ('< sp_arg>'), donde < predicado>

Ejemplo:

seleccione Objeto, DbspaceName, ObjSize de sp_iqindexinfo ('tabla xyz') donde Object como '% col1_indx%'

Cuestiones relacionadas