web-dev-qa-db-ja.com

Sybase:特定のテーブルを使用してストアドプロシージャのリストを取得する

Sybaseデータベースに500個のストアドプロシージャがあります。 SQLを使用して、tbl_booksなどの特定のテーブルを使用しているすべてのストアドプロシージャのリストを取得できますか?

13
Ravi

次のようなものを使用します。

Select distinct sysobjects.name
, case 
 when sysobjects.type = 'TR' then 'TRIGGER' 
 when sysobjects.type = 'P' then 'PROCEDURE' 
 when sysobjects.type = 'V' then 'VIEW' 
 else 'UNKNOWN' end type
from sysobjects inner join syscomments
on sysobjects.id = syscomments.id
where syscomments.text like '%tbl_books%'
27
George Dontas

最初はsp_dependsを試してみました。

Syntax: sp_depends objname[, column_name]

objnameには、テーブル、ビュー、sprocなどの任意のオブジェクト名を指定できます。

3
AdamH

このようなsyscommentsを使用すると、tbl_books_newなどの別のテーブル名がある場合は機能しなくなります。より良い方法はsysdependsを使用することです

select so1.name from
sysobjects so1, sysobjects so2, sysdepends sd
where so1.id = sd.id
and   so2.id = sd.depid
and   so2.name = 'tbl_books'
and   so1.type = 'P'
2
vivekprakash

Syscommentsのテキスト列はvarchar(255)であるため、1つの大きなプロシージャがsyscommentsの複数の行で構成される可能性があるため、検索しているテーブル名が分割されている場合、上記の選択ではプロシージャ名が見つかりません。 syscommentsの2つのテキスト行に。

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

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

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 の作成者に行きます

0
B0rG