Найти хранимую процедуру по имени


84

Есть ли способ найти в SQL Server Management Studio хранимую процедуру по имени или по части имени? (в активном контексте базы данных)

Спасибо за помощь

Ответы:


142

Вы можете использовать:

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
Гарри Саршох

2
Sql 2012, пришлось сделать inner join sys.procedures p on p.object_id = c.idвместо этого
user5226582

1
Примечание для SQL Server: стандартная версия ANSI отсекает ROUTINE_DEFINITION на 8k. Вы можете использовать его object_definition(object_id(r.ROUTINE_NAME)),как альтернативу.
Марк Шультайс

+1 для стандартной версии ANSI, которая возвращает каталог (базу данных) и схему на случай, если вы не уверены, где находится процедура. (В качестве примера я нашел задание агента, ссылающееся на процедуру, которую я не мог легко найти; стандартный запрос ANSI решил эту проблему для меня).
youcantryreachingme

42

Предполагая, что вы находитесь в окне «Сведения об обозревателе объектов» ( F7), где отображается список хранимых процедур, нажмите кнопку «Фильтры» и введите имя (или часть имени).

альтернативный текст


2
Большое вам спасибо, что я не знал о фильтре. Как-то я никогда не видел эту кнопку.
Чад Портман

5

Это будет работать и для таблиц и представлений (среди прочего), а не только для sprocs:

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», что не очень помогло. Когда я запускал тот же sql в SSSM, он добавлял «в процедуру '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

Для 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%';

0

Вариант 1. В SSMS перейдите к View > Object Explorer Detailsили нажмите F7. Используйте Searchкоробку. Наконец, в отображаемом списке щелкните правой кнопкой мыши и выберите, Synchronizeчтобы найти объект в Object Explorerдереве.

Сведения об обозревателе объектов

Вариант 2: Установить надстройку вроде dbForge Search. Щелкните правой кнопкой мыши отображаемый список и выберите Find in Object Explorer.

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.