在 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中一个表的存储过程?

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

sql server系统存储过程大全

如何使用 SQL Server 中的存储过程在单个查询中插入多行

在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题