Знайдіть збережену процедуру за іменем


83

Чи можу я якось знайти в SQL Server Management Studio збережену процедуру за іменем або за частиною імені? (щодо активного контексту бази даних)

Дякую за допомогу

Відповіді:


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"
Гаррі Саршог,

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

Якщо припустити, що ви знаходитесь в Object Explorer Details ( 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.