Sybaseデータベースに500個のストアドプロシージャがあります。 SQLを使用して、tbl_books
などの特定のテーブルを使用しているすべてのストアドプロシージャのリストを取得できますか?
次のようなものを使用します。
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%'
最初はsp_depends
を試してみました。
Syntax: sp_depends objname[, column_name]
objname
には、テーブル、ビュー、sprocなどの任意のオブジェクト名を指定できます。
このような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'
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 の作成者に行きます