如何从Sybase中的存储过程中进行选择?

时间:2009-09-18 08:24:44

标签: tsql stored-procedures select sybase

我的DBA在Sybase数据库中构建了一个存储过程,我没有这个定义。 如果我运行它,它将返回一组带有一组列和值的结果集。我想进一步SELECT以减少结果集中的行。这可能吗?

this question开始,我似乎可以将结果插入到临时表中,但我不确定我是否有权执行此操作。

有什么方法可以选择某些行,或者如果没有,有人可以给我一些模拟临时表的示例代码吗?

7 个答案:

答案 0 :(得分:4)

在Sybase ASE中,我们可以使用此hack通过“代理表”从存储过程中进行选择:

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

示例:

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 :(得分:2)

据我所知,这在Sybase ASE中是不可能的。即使使用

insert #temp_table
exec my_procedure

不起作用(至少在sybase 12.x上)。

答案 2 :(得分:2)

您需要让DBA更改存储过程。

您可以将其更改为将结果选择为临时表格而不是普通选择,然后您可以在该临时表上编写自己的选择以仅返回所需的行

答案 3 :(得分:2)

在Sybase IQ(至少12.6及更高版本)下,您可以从存储过程中进行选择,并将结果过滤为好像是表。我不知道这是否适用于ASE或ASA,但你可以尝试一下。

因此,如果您的存储过程被称为myproc,那么结果集的列可以是0或1,并且您只想选择ACTIVE = 1行。

SELECT * FROM myproc()WHERE ACTIVE = 1

在IQ下,您也可以将其用作派生表,并将其与其他表联接,例如像这样...

SELECT t1.name,t1.address,t2,active 从tbl_atable t1, (SELECT * FROM myproc()WHERE ACTIVE = 1)t2 在哪里t1.active = t2.active

......这有点整洁!

我希望您运行的Sybase版本都适用。

答案 4 :(得分:2)

有可能使用ASE,但使用CIS和代理表的方式相当迂回。这个机制在Rob Verschoor的网站上得到了很好的描述:

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

我曾经尝试过一次作为一种好奇心,确实它确实有效。我没有深入研究错误处理这个棘手的问题。

pjjH

答案 5 :(得分:1)

只是一个想法。

也许你的DBA可以准备一个视图而不是一个存储过程,如果他出于某种原因想要你不要看内心的东西或担心它。

另一种方法是使用sp_helptext查看存储过程文本(除非加密),并为自己的目的重写它(例如,在视图中),以便能够对结果集应用额外的条件。

答案 6 :(得分:0)

在Sybase IQ中,您可以执行以下操作:

  

选择< col1>,< COL2>来自< sp_name>('< sp_arg>')其中<谓词>

示例:

  

从sp_iqindexinfo('table xyz')中选择Object,DbspaceName,ObjSize,其中Object为'%col1_indx%'