Список хранимых процедур из таблицы
-
02-07-2019 - |
Вопрос
У меня огромная база данных с сотнями таблиц и хранимых процедур.Как с помощью SQL Server 2005 получить список хранимых процедур, выполняющих операции вставки или обновления в данной таблице?
Решение
select
so.name,
sc.text
from
sysobjects so inner join syscomments sc on so.id = sc.id
where
sc.text like '%INSERT INTO xyz%'
or sc.text like '%UPDATE xyz%'
Это даст вам список всего содержимого хранимых процедур с INSERT или UPDATE для конкретной таблицы (очевидно, вы можете настроить запрос по своему усмотрению).Кроме того, более длинные процедуры будут разбиты на несколько строк в возвращаемом наборе записей, поэтому вам, возможно, придется вручную просмотреть результаты.
Редактировать:Изменен запрос, чтобы он также возвращал имя SP.Также обратите внимание, что приведенный выше запрос вернет как UDF, так и SP.
Другие советы
sys.sql_dependencies
имеет список сущностей с зависимостями, включая таблицы и столбцы, которые процедура включает в запросы.Видеть эта почта для примера запроса, который извлекает зависимости.Приведенный ниже фрагмент кода получит список зависимостей таблицы/столбца с помощью хранимой процедуры.
select sp.name as sproc_name
,t.name as table_name
,c.name as column_name
from sys.sql_dependencies d
join sys.objects t
on t.object_id = d.referenced_major_id
join sys.objects sp
on sp.object_id = d.object_id
join sys.columns c
on c.object_id = t.object_id
and c.column_id = d.referenced_minor_id
where sp.type = 'P'
Используйте sys.dm_sql_referencing_entities.
Обратите внимание, что sp_dependents устарел.
Вы можете попробовать экспортировать все хранимые процедуры в текстовый файл, а затем использовать простой поиск.
Более продвинутый метод — использовать поиск по регулярным выражениям для поиска всех записей SELECT FROM и INSERT FROM.
Кажется, это работает:
select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means
Если вы загрузите sp_search_code с веб-сайта Vyaskn, это позволит вам найти любой текст в объектах вашей базы данных.
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name
Эта ссылка использовался как ресурс для поиска ИП.