Есть ли способ найти в SQL Server Management Studio хранимую процедуру по имени или по части имени? (в активном контексте базы данных)
Спасибо за помощь
Ответы:
Вы можете использовать:
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%'
inner join sys.procedures p on p.object_id = c.id
вместо этого
object_definition(object_id(r.ROUTINE_NAME)),
как альтернативу.
Предполагая, что вы находитесь в окне «Сведения об обозревателе объектов» ( F7), где отображается список хранимых процедур, нажмите кнопку «Фильтры» и введите имя (или часть имени).
Это будет работать и для таблиц и представлений (среди прочего), а не только для 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
Он также дает вам имя схемы, которое будет полезно в любой нетривиальной базе данных (например, в той, где вам нужен запрос для поиска хранимой процедуры по имени).
Вы можете использовать этот запрос:
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')
Как видите, вы также можете выполнять поиск внутри тела хранимой процедуры.
Очень изящный трюк, который я наткнулся на попытку некоторой SQL-инъекции, в обозревателе объектов в поле поиска просто используйте ваши процентные символы, и это будет искать ВСЕ хранимые процедуры, функции, представления, таблицы, схемы, индексы ... Я устал думать о большем :)
Когда у меня есть имя процедуры хранения и я не знаю, к какой базе данных оно принадлежит, я использую следующее:
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
Для 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%';
Вариант 1. В SSMS перейдите к View > Object Explorer Details
или нажмите F7. Используйте Search
коробку. Наконец, в отображаемом списке щелкните правой кнопкой мыши и выберите, Synchronize
чтобы найти объект в Object Explorer
дереве.
Вариант 2: Установить надстройку вроде dbForge Search
. Щелкните правой кнопкой мыши отображаемый список и выберите Find in Object Explorer
.