按名称查找存储过程


83

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

感谢帮助

Answers:


141

您可以使用:

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

如果您需要代码,可以在syscomments表中查看

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%'

1
如果要获取带有名称的sp的文本,则可以使用“ sp_helptext SPNAME”更轻松
Harry Sarshogh

2
SQL 2012,不得不做inner join sys.procedures p on p.object_id = c.id相反
user5226582 '18

1
请注意,对于SQL Server,ANSI标准版本在8k时中断了ROUTINE_DEFINITION。您可以将其object_definition(object_id(r.ROUTINE_NAME)),用作替代方案。
Mark Schultheiss,

ANSI标准版本+1,如果您不确定过程位于何处,该标准版本将返回目录(数据库)和架构。(通过示例,我发现一个Agent作业引用了一个我不容易找到的过程; ANSI标准查询为我解决了这个问题)。
youcantryreachingme 18/09/26

42

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

替代文字


2
非常感谢,我不知道关于过滤器的事情,以某种方式我从未见过该按钮。
乍得波特曼

5

这也将适用于表和视图(以及其他功能),而不仅是存储过程:

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

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


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

1

您可以使用以下查询:

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')

如您所见,您也可以在存储过程的正文中进行搜索。


0

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

搜索模式


0

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

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


0

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

对象资源管理器详细信息

选项2:安装类似的附加组件dbForge Search。右键单击显示的列表,然后选择Find in Object Explorer

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.