在 SQL Server 上查询存储过程的内容
Posted
技术标签:
【中文标题】在 SQL Server 上查询存储过程的内容【英文标题】:Query the contents of stored procedures on SQL Server 【发布时间】:2011-12-02 22:36:40 【问题描述】:我正在探索一个遗留数据库系统,但对其内部结构知之甚少。我想找到调用另一个存储过程A
的所有存储过程。
如何最好地做到这一点?
我可以写这样的伪代码吗:
select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A'
Asp.TextualContent
表示 SP 中包含的实际 SQL。
【问题讨论】:
【参考方案1】:SELECT OBJECT_NAME(object_id),
definition
FROM sys.sql_modules
WHERE objectproperty(object_id,'IsProcedure') = 1
AND definition like '%Foo%'
【讨论】:
【参考方案2】:试试这只有一个语句可以解决你的问题..
SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc'))
或
SELECT @objname= OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc'))
print @objname
【讨论】:
【参考方案3】:此查询将检索存储过程的文本定义并使用简单的通配符进行过滤。
对于 2000 年(未经测试,但 IIRC 是正确的表):
select p.[type]
,p.[name]
,c.[text]
from sysobjects p
join syscomments c
on p.object_id = c.id
where p.[type] = 'P'
and c.[text] like '%foo%'
2005 年:
select p.[type]
,p.[name]
,c.[text]
from sys.objects p
join sys.syscomments c
on p.object_id = c.id
where p.[type] = 'P'
and c.[text] like '%foo%'
2005 年和 2008 年以上
select p.[type]
,p.[name]
,c.[definition]
from sys.objects p
join sys.sql_modules c
on p.object_id = c.object_id
where p.[type] = 'P'
and c.[definition] like '%foo%'
【讨论】:
sys.syscomments
不应用于此,因为它将长定义分成 4,000 个字符块,因此您可能会错过跨越块边界的匹配。【参考方案4】:
对于 SQL Server 2005/2008:
SELECT s.name SchemaName
,o.name RoutineName
,o.[type] RoutineType
,procs.*
FROM sys.sql_modules procs
INNER JOIN sys.objects o ON procs.object_id = o.object_id
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE procs.[definition] LIKE '%A%'
--AND o.[type] = 'P' --'P' for stored procedures
【讨论】:
以上是关于在 SQL Server 上查询存储过程的内容的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER 存储过程中如何使用传入的DB参数,实现跨库查询?
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?