10

プロシージャのどこかに表示されるテキスト文字列を指定して、Sybaseデータベースでストアドプロシージャを見つけるにはどうすればよいですか?db内の他のprocが、私が見ているものと同様のロジックを持っているかどうかを確認したいのですが、かなりユニークな検索文字列(リテラル)があると思います

編集:

Sybaseバージョン11.2を使用しています

4

6 に答える 6

15

Graemeの答えの2つのバリエーション(したがって、これは11.2でも機能しません):

これにはsprocの名前もリストされますが、テキストが複数回表示される場合は、sprocごとに複数の行が返されます。

select object_name(id),* from syscomments 
   where texttype = 0 and text like '%whatever%'

これにより、各sprocが1回だけ一覧表示されます。

select distinct object_name(id) from syscomments 
   where texttype = 0 and text like '%whatever%'
于 2008-11-06T13:57:28.377 に答える
8

SQL Anywhere と Sybase IQ の場合:

select * from SYS.SYSPROCEDURE where proc_defn like '%whatever%'

私はASEに精通していませんが、ドキュメント(sybooks.sybase.comから入手可能)によると、次のようなものです:

select * from syscomments where texttype = 0 and text like '%whatever%'
于 2008-10-30T16:40:24.157 に答える
6

syscomments のテキスト列は varchar(255) であるため、syscomments では 1 つの大きな手順が多数の行で構成される可能性があることに注意してください。したがって、syscomments で 2 つのテキスト行に分割されている場合、上記の選択では手順名が見つかりません。

上記のケースを処理する次の選択をお勧めします。

declare @text varchar(100)
select @text        = "%whatever%"

select distinct o.name object
from sysobjects o,
    syscomments c
where o.id=c.id
and o.type='P'
and (c.text like @text
or  exists(
    select 1 from syscomments c2 
        where c.id=c2.id 
        and c.colid+1=c2.colid 
        and right(c.text,100)+ substring(c2.text, 1, 100) like @text 
    )
)
order by 1

-- ASEisql の作成者に感謝します

于 2011-12-29T13:03:17.220 に答える
6
select *  from sysobjects where 
    id in ( select distinct (id) from syscomments where text like '%SearchTerm%')
    and xtype = 'P'
于 2010-07-13T13:35:21.470 に答える
3
select distinct object_name(syscomments.id) 'SearchText', syscomments.id from syscomments ,sysobjects 
   where texttype = 0 and text like '%SearchText%' and syscomments.id=sysobjects.id and sysobjects.type='P'
于 2010-08-12T05:03:28.813 に答える
0

データベース オブジェクトのテキストを格納するために複数の行が使用され、値が 2 つの行にまたがる場合があります。したがって、より正確な答えは次のとおりです。

select distinct object_name(sc1.id)
from syscomments sc1
left join syscomments sc2
on (sc2.id = sc1.id and 
sc2.number = sc1.number and
sc2.colid2 = sc1.colid2 + ((sc1.colid + 1) / 32768) and
sc2.colid = (sc1.colid + 1) % 32768)
where
sc1.texttype = 0 and
sc2.texttype = 0 and
lower(sc1.text + sc2.text) like lower('%' ||     @textSearched || '%')
于 2018-06-06T16:19:03.267 に答える