【问题标题】:How do I select from a stored procedure in Sybase?如何从 Sybase 中的存储过程中进行选择?
【发布时间】:2010-11-29 09:59:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: tsql stored-procedures select sybase


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

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

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

      SELECT * FROM myproc() WHERE ACTIVE = 1

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

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

      ...这有点整洁!

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          pjjH

          【讨论】:

            【解决方案5】:

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

            insert #temp_table
            exec my_procedure
            

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

            【讨论】:

            • 您可以在 Sybase IQ 中执行此操作...参见@user1746917 的回答
            【解决方案6】:

            只是一个想法。

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

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

            【讨论】:

              【解决方案7】:

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

              select , from ('') where

              例子:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-12-02
                • 2016-07-03
                • 2014-07-17
                • 2010-12-10
                • 2010-10-22
                • 2014-12-07
                • 1970-01-01
                相关资源
                最近更新 更多