У меня огромная база данных с сотнями таблиц и хранимых процедур. Используя SQL Server 2005, как я могу получить список хранимых процедур, которые выполняют операцию вставки или обновления в данной таблице.


Вы можете попробовать экспортировать все свои хранимые процедуры в текстовый файл, а затем использовать простой поиск.
Более продвинутым методом было бы использование поиска по регулярному выражению для поиска всех записей SELECT FROM и INSERT FROM.
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
Эта ссылка использовался как ресурс для поиска SP.
Используйте sys.dm_sql_referencing_entities
Обратите внимание, что sp_depends устарела.
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.
Да, я изменил запрос, чтобы включить это. Я вижу, что сейчас опубликовано еще несколько ответов, которые также помогут вам.
Мой ответ здесь: stackoverflow.com/questions/119679/… почти идентичен (возвращает имя). Однако я думаю, что Люк прав в том, что нет необходимости использовать DISTINCT, как в моем ответе
Это работает, но не во всех случаях. Например, если кто-то использует больше пробелов или символов табуляции между ключевыми словами SQL и именем таблицы.
Кажется, это работает:
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
sys.sql_dependencies имеет список сущностей с зависимостями, включая таблицы и столбцы, которые sproc включает в запросы. См. эта почта для примера запроса, который извлекает зависимости. Приведенный ниже фрагмент кода получит список зависимостей таблицы / столбца по хранимой процедуре.
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'
Библиотека MSDN говорит, что теперь он устарел и должен быть заменен на sys.sql_expression_dependencies. К сожалению, я не могу заставить эквивалент работать. В запросе, показанном в ответе, d.object_id больше не существует. Я пробовал d.referencing_id, но это тоже не сработало. Есть идеи, как использовать sql_expression_dependencies?
На sys.sql_expression_dependenciesreferencing_id - это элемент, который ссылается на цель, а referenced_id - это зависимость. В таблице также есть схемы и имена сущностей для ссылочных сущностей в таблице. Второстепенные идентификаторы относятся к номерам столбцов, при этом 0 указывает на отсутствие ссылки на конкретный столбец.
Я думаю, что у меня все это вниз. Я думаю, проблема в том, что все мои строки sql_expression_dependencies имеют 0 для referenced_minor_id. Аналогичный запрос sql_dependencies вернул много ненулевых строк, и я удивлен, что результаты такие же разные. Кажется, что это эффективно делает sql_expression_dependencies намного менее полезным, потому что я часто хочу видеть, какие sproc ссылаются на конкретный столбец. Для справки, я сделал выборку (*) из обоих, где referenced_minor_id <> 0. Таких строк 38119 в sql_dependencies и 112 в sql_expression_dependencies.
@Drew - Да, похоже, что ссылки sproc не перечисляют отдельные столбцы в sys.sql_expression_dependencies. В SQL Server 2008+ есть несколько функций - sys.dm_sql_referencing_entities, sys.dm_sql_referenced_entities - которые будут делать это для определенного объекта и возвращать набор записей с зависимостями на уровне столбцов.
это дает мне идентификатор SP ... могу ли я достичь имени SP с этим идентификатором?