【问题标题】:Query the contents of stored procedures on SQL Server在 SQL Server 上查询存储过程的内容
【发布时间】:2011-12-02 22:36:40
【问题描述】:

我正在探索一个遗留数据库系统,但对其内部结构知之甚少。我想找到调用另一个存储过程A的所有存储过程。

如何最好地做到这一点?

我可以写这样的伪代码吗:

select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A'

Asp.TextualContent 表示 SP 中包含的实际 SQL。

【问题讨论】:

    标签: sql-server sql-server-2005 tsql relational-database


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2015-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 2012-12-25
          • 2020-02-11
          • 1970-01-01
          相关资源
          最近更新 更多