【问题标题】:How to find the name of stored procedure, based on table name search, using SQL Server 2008?如何使用 SQL Server 2008 根据表名搜索查找存储过程的名称?
【发布时间】:2011-08-03 09:23:35
【问题描述】:

我想找到正在使用特定表的所有存储过程。数据库中有大量的存储过程,因此不可能对每个过程进行检查。

有没有什么方法可以使用搜索查询来找到存储过程?

我试过这段代码:

SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'

RejectionReason 是我的表名,但它显示了所有使用RejectionReason 作为列名的过程,所以这不起作用。

【问题讨论】:

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:
SELECT o.name, o.type_desc, p.name, p.type_desc
FROM sys.sql_dependencies d
INNER JOIN sys.objects o
    ON d.object_id = o.object_id
INNER JOIN sys.objects p
    ON d.referenced_major_id = p.object_id
    AND o.name = 'RejectionReason'

SELECT o.name, t.TABLE_NAME, c.text 
  FROM syscomments c 
  JOIN sysobjects o 
    ON c.id = o.id
  JOIN INFORMATION_SCHEMA.Tables t
    ON  c.text LIKE '%RejectionReason%' 

EXEC sp_depends @objname = N'RejectionReason';

如果这些都不能帮助您查看此博客: http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-routines-and-sys-dm_sql_referencing_entities/

【讨论】:

  • -1 表示不正确。而不是@objectname,它必须是@objname。更正后会将其转换为 +1。
【解决方案2】:

尝试使用RedGate的免费工具SQL Search

【讨论】:

    【解决方案3】:

    这是一段代码,希望它能正常工作。只需根据您的代码更改表名

    SELECT DISTINCT so.name 
    FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
    WHERE sc.text LIKE '%tablename%'
    

    例如:

    SELECT DISTINCT so.name 
    FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
    WHERE sc.text LIKE '%users%'
    

    您将获得存储过程列表和表关系。

    【讨论】:

    • 像魅力一样工作,我也在 SQL Server 2014 中进行了测试!谢谢
    【解决方案4】:

    根据MSDN sp_depends 将在以后的版本中删除,以防您使用它,您可以改用以下query

    SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
    FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');
    

    【讨论】:

      【解决方案5】:

      我知道有两种可能性。

      首先,SQL Management Studio 有一个显示依赖项的选项。右键单击表并选择View Dependencies 但是,这不会突出显示表名嵌入在动态 SQL 中的 usps。

      第二个选项是右键单击数据库并选择Generate Scripts。按照向导并将所有 usps 脚本写入一个新的查询窗口,然后在该窗口中搜索您的表的名称。这比较费力,但会找到所有用途。

      【讨论】:

        【解决方案6】:

        我猜这个脚本显示了表的所有依赖对象,包括 SP。

        USE MYDatabase
        GO
        
        DECLARE @TableName varchar(100)
        SET @TableName = 'mytable'
        
        SELECT
         SourceSchema                  = OBJECT_SCHEMA_NAME(sed.referencing_id)
         ,SourceObject                 = OBJECT_NAME(sed.referencing_id)
         ,ReferencedDB                 = ISNULL(sre.referenced_database_name, DB_NAME())
         ,ReferencedSchema             = ISNULL(sre.referenced_schema_name,
        OBJECT_SCHEMA_NAME(sed.referencing_id))
         ,ReferencedObject             = sre.referenced_entity_name
         ,ReferencedColumnID   = sre.referenced_minor_id
         ,ReferencedColumn             = sre.referenced_minor_name
        FROM sys.sql_expression_dependencies sed
        CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id)
        + '.' + OBJECT_NAME(sed.referencing_id), 'OBJECT') sre
        WHERE sed.referenced_entity_name = @TableName
        AND sre.referenced_entity_name = @TableName
        

        有关更多详细信息,您可以查看。 http://sqlserverplanet.com/sql-server-2008/find-dependent-objects/

        【讨论】:

          【解决方案7】:

          这将返回 SP 和视图。

          SELECT DISTINCT o.name AS Object_Name,o.type_desc
          FROM sys.sql_modules m 
          INNER JOIN sys.objects o 
              ON m.object_id=o.object_id
          WHERE m.definition Like '%TableName%'
          

          【讨论】:

            【解决方案8】:

            SysObjects 存储有关数据库内所有对象的基本信息。了解它对您很有用,因为它告诉我们每个对象的名称和对象的类型。

            SysComments 存储存储过程和函数的实际文本(代码)。它包含一个 ID 字段,该字段映射回 SysObjects 中的 id 字段。

            select so.name, text
            from sysobjects so, syscomments sc
            where so.id = sc.id
            and text like '%RejectionReason%'
            

            【讨论】:

              【解决方案9】:

              我正在使用以下 SQL 脚本来搜索列名数据库所有存储过程中的文本。您也可以使用它来查找存储过程中的表。

              在变量 @SearchFor 中指定搜索词(就像在 LIKE 表达式中使用它一样,例如 '%LastName%' 以查找包含以下内容的列和存储过程LastName)。

              它将查找表中的列名以及存储过程中的文本。如果将@SPNameOnly设置为0,脚本甚至可以显示SP源代码。

              --
              -- Purpose: Search field names in all tables, views stored procedures
              --
              
              DECLARE @SearchFor nvarchar(max)='%Search_SP_Or_Table_Or_View%' -- search for this string
              DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
              DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code
              
              -- tables
              if (@SearchSP=1) begin  
                (
                select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
                          t.table_type 
                from information_schema.columns c
                left join information_schema.Tables t on c.table_name=t.table_name
                where column_name like @SearchFor or t.table_name like @SearchFor 
                UNION
                select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
                       'PROCEDURE' as table_type from information_schema.routines
                where routine_definition like @SearchFor or routine_name like @SearchFor 
                      and routine_type='procedure'
                )
                order by table_type, schema_object
              end else begin
                select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
                       t.table_type 
                from information_schema.columns c
                left join information_schema.Tables t on c.table_name=t.table_name
                where column_name like @SearchFor or t.table_name like @SearchFor 
                order by c.table_Name, c.column_name
              end     
              -- stored procedure (source listing)
              if (@SearchSP=1) begin      
                  if (@DisplaySPSource=1) begin
                    select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
                    from information_schema.routines
                    where routine_definition like @SearchFor  or routine_name like @SearchFor 
                    and routine_type='procedure'
                    order by routine_name
                  end
              end
              

              【讨论】:

                猜你喜欢
                • 2014-09-01
                • 2019-01-21
                • 1970-01-01
                • 2011-05-01
                • 1970-01-01
                • 2012-12-25
                • 2011-04-04
                • 2011-09-15
                • 1970-01-01
                相关资源
                最近更新 更多