6

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

这个问题来看,我似乎可以将结果插入到一个临时表中,但我不确定我是否有权这样做。

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

4

7 回答 7

4

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

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
于 2012-10-19T10:49:14.390 回答
3

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

因此,如果您的存储过程称为 myproc 并且结果集有一个 ACTIVE 列,该列可以是 0 或 1,并且您只想选择 ACTIVE = 1 行,您可以这样做。

SELECT * FROM myproc() WHERE ACTIVE = 1

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

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

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

我希望这适用于您正在运行的任何版本的 Sybase。

于 2009-09-24T18:59:07.253 回答
2

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

insert #temp_table
exec my_procedure

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

于 2009-09-18T08:36:56.123 回答
2

使用 ASE 是可能的,但是使用 CIS 和代理表以一种相当迂回的方式。该机制在 Rob Verschoor 的网站上有很好的描述:

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

我出于好奇尝试过一次,确实有效。我没有深入研究错误处理的棘手问题。

pjjH

于 2009-09-24T19:56:26.093 回答
2

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

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

于 2009-09-19T14:17:34.337 回答
1

在 Sybase IQ 中,您可以这样做:

select <col1>, <col2> from <sp_name>('<sp_arg>') where <predicate>

例子:

select Object, DbspaceName, ObjSize from sp_iqindexinfo ('table xyz') where Object like '%col1_indx%'

于 2014-08-11T11:13:48.193 回答
1

只是一个想法。

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

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

于 2013-01-21T12:12:22.540 回答