Sybase:获取使用特定表的存储过程列表

14

我在Sybase数据库中有500个存储过程。使用SQL,我能否获取所有正在使用特定表(例如tbl_books)的存储过程列表?

5个回答

29

可以使用以下内容:

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%'

3

最初我会尝试使用sp_depends

Syntax: sp_depends objname[, column_name]

对于objname,您可以提供任何对象名称,例如表、视图或存储过程。


问题是相反的。他需要一个与sp_depends相反的功能。 - mtk
@mtk。从帮助中心得知:“显示有关依赖于指定表或视图的数据库对象依赖项 - 视图、触发器和过程 - 在数据库中的信息”。http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs68.htm - AdamH
抱歉,我的错误。需要完全阅读文档 :) - mtk

2

如果有另一个表名比如 tbl_books_new,那么像这样使用 syscomments 的方式将不再适用。更好的方法是使用 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'

0

可以考虑如下内容:

select proc_name from sysprocedures where proc_defn like "%tbl_books%"

抱歉,在 sysprocedures 表中找不到 proc_name 和 proc_defn 列;选择前 5 条*从 sysprocedures 表中类型 ID 序列状态编号版本  ----------- ----------- ----------- ----------- ----------- ----------- 2 3031 0 1026 0 12500 2 3031 1 1026 0 12500 2 3031 2 1026 0 12500 2 3031 3 1026 0 12500 2 3031 4 1026 0 12500 - Ravi

0
请记住,syscomments 中的文本列为 varchar(255),因此一个大型存储过程可能由 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的创建者


是的,每当我需要一些数据库查询时,我也信任ASEisql工具。它真的是一个很棒的工具:) - SSE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接