代码之家  ›  专栏  ›  技术社区  ›  Nick Fortescue

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

  •  6
  • Nick Fortescue  · 技术社区  · 15 年前

    如果我运行它,它将返回一个带有一组列和值的结果集。我想进一步选择以减少结果集中的行。这可能吗?

    从…起 this question 看起来我可以将结果插入到临时表中,但我不确定我是否有这样做的权限。

    是否有任何方法可以选择某些行,或者如果没有,是否有人可以给我一个示例代码来模拟一个临时表?

    7 回复  |  直到 8 年前
        1
  •  4
  •   Sam Watkins    10 年前

    在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
    
        2
  •  2
  •   mmmmmm    15 年前

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

        3
  •  2
  •   Kevin Horgan    15 年前

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

    因此,如果将存储过程称为myproc,则结果集有一个活动列,该列可以是0或1,并且您只希望选择活动=1行,则可以执行此操作。

    从myproc()中选择*ACTIVE=1

    在IQ下,您也可以将其用作派生表,并将其与其他表连接,例如:。。。

    选择t1.名称、t1.地址、t2、活动 (从myproc()中选择*,其中ACTIVE=1)t2

    …有点整洁!

    我希望无论您运行哪个版本的Sybase都能正常工作。

        4
  •  2
  •   Paul Harrington    15 年前

    使用ASE是可能的,但使用CIS和代理表的方式比较迂回。Rob Verschoor的网站对该机制进行了详细描述:

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

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

    pjjH

        5
  •  2
  •   Sam Watkins    10 年前

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

    insert #temp_table
    exec my_procedure
    

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

        6
  •  1
  •   B0rG    12 年前

    只是一个想法。

    如果DBA出于某种原因希望您不要查看或担心内部内容,那么他可能会准备一个视图而不是存储过程。

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

        7
  •  0
  •   Sam Watkins    10 年前

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

    从sp_iquindexinfo('table xyz')中选择对象、DbspaceName、ObjSize,其中的对象类似于“%col1\u indx%”