【问题标题】:Find stored procedure by name按名称查找存储过程
【发布时间】:2011-04-04 04:57:32
【问题描述】:

有什么方法可以在 SQL Server Management Studio 存储过程中按名称或部分名称找到? (在活动数据库上下文中)

感谢您的帮助

【问题讨论】:

    标签: sql database sql-server-2005 ssms


    【解决方案1】:

    你可以使用:

    select * 
    from 
       sys.procedures 
    where 
       name like '%name_of_proc%'
    

    如果您需要代码,可以查看 syscmets 表

    select text 
    from 
        syscomments c
        inner join sys.procedures p on p.object_id = c.object_id
    where 
        p.name like '%name_of_proc%'
    

    编辑更新:

    你也可以使用ansi标准版

    SELECT * 
    FROM 
        INFORMATION_SCHEMA.ROUTINES 
    WHERE 
        ROUTINE_NAME LIKE '%name_of_proc%'
    

    【讨论】:

    • 如果你想得到带有名字的sp的文本,使用“sp_helptext SPNAME”会更容易
    • Sql 2012,不得不改用inner join sys.procedures p on p.object_id = c.id
    • 注意 SQL Server ANSI 标准版本在 8k 处切断了 ROUTINE_DEFINITION。您可以使用 object_definition(object_id(r.ROUTINE_NAME)), 作为替代方案,这是一个问题。
    • +1 表示 ANSI 标准版本,它返回目录(数据库)和模式,以防您不确定程序的位置。 (例如,我发现一个代理作业引用了一个我不容易找到的过程;ANSI 标准查询为我解决了这个问题。
    【解决方案2】:

    假设您在显示存储过程列表的对象资源管理器详细信息 (F7) 中,单击过滤器按钮并输入名称(或部分名称)。

    【讨论】:

    • 非常感谢我不知道过滤器的事情不知何故我从未见过那个按钮。
    【解决方案3】:

    这也适用于表和视图(除其他外),而不仅仅是存储过程:

    SELECT
        '[' + s.name + '].[' + o.Name + ']',
        o.type_desc
    FROM
        sys.objects o
        JOIN sys.schemas s ON s.schema_id = o.schema_id
    WHERE
        o.name = 'CreateAllTheThings' -- if you are certain of the exact name
        OR o.name LIKE '%CreateAllThe%' -- if you are not so certain
    

    它还为您提供了架构名称,该名称在任何重要的数据库中都很有用(例如,您需要查询以按名称查找存储过程的数据库)。

    【讨论】:

    • 将旧版应用程序从 sql 2005 迁移到 2016 我的脚本在 '@errorMessage' 附近出现“语法错误”,这并没有太大帮助。当我在 SSSM 中运行相同的 sql 时,它添加了“in procedure 'some_name'”,但任何地方都没有这样的存储过程!原来这是一个触发器,您的查询找到了它。谢谢!
    【解决方案4】:

    你可以使用这个查询:

    SELECT 
        ROUTINE_CATALOG AS DatabaseName ,
        ROUTINE_SCHEMA AS SchemaName,
        SPECIFIC_NAME AS SPName ,
        ROUTINE_DEFINITION AS SPBody ,
        CREATED AS CreatedDate,
        LAST_ALTERED AS LastModificationDate
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE 
        (ROUTINE_DEFINITION LIKE '%%')
        AND 
        (ROUTINE_TYPE='PROCEDURE')
        AND
        (SPECIFIC_NAME LIKE '%AssessmentToolDegreeDel')
    

    如您所见,您也可以在存储过程的主体内进行搜索。

    【讨论】:

      【解决方案5】:

      对于 SQL Server 9.0 (2005) 版,您可以使用以下代码:

      select * 
      from 
      syscomments c
      inner join sys.procedures p on p.object_id = c.id
      where 
      p.name like '%usp_ConnectionsCount%';
      

      【讨论】:

        【解决方案6】:

        当我有一个存储过程名称,并且不知道它属于哪个数据库时,我使用以下 -

        Use [master]
        GO
        
        DECLARE @dbname VARCHAR(50)   
        DECLARE @statement NVARCHAR(max)
        
        DECLARE db_cursor CURSOR 
        LOCAL FAST_FORWARD
        FOR  
        --Status 48 (mirrored db)
        SELECT name FROM MASTER.dbo.sysdatabases WHERE STATUS NOT LIKE 48 AND name NOT IN ('master','model','msdb','tempdb','distribution')  
        
        OPEN db_cursor  
        FETCH NEXT FROM db_cursor INTO @dbname  
        WHILE @@FETCH_STATUS = 0  
        BEGIN  
        
        SELECT @statement = 'SELECT * FROM ['+@dbname+'].INFORMATION_SCHEMA.ROUTINES  WHERE [ROUTINE_NAME] LIKE ''%name_of_proc%'''+';'
        print @statement
        
        EXEC sp_executesql @statement
        
        FETCH NEXT FROM db_cursor INTO @dbname  
        END  
        CLOSE db_cursor  
        DEALLOCATE db_cursor
        

        【讨论】:

          【解决方案7】:

          选项 1: 在 SSMS 中转到 View > Object Explorer Details 或按 F7。使用Search 框。最后在显示的列表中右键选择Synchronize,在Object Explorer树中找到对象。

          选项 2: 安装像 dbForge Search 这样的插件。右键单击显示的列表并选择Find in Object Explorer

          【讨论】:

          • 谢谢你路易斯·埃尔南德斯
          【解决方案8】:

          非常巧妙的技巧我偶然发现了一些 SQL 注入,在搜索框中的对象资源管理器中只需使用您的百分比字符,这将搜索所有存储过程、函数、视图、表、模式、索引......我厌倦了想更多:)

          Search Pattern

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-01
            • 2011-11-05
            • 1970-01-01
            • 2012-12-25
            相关资源
            最近更新 更多