Список хранимых процедур из таблицы

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
8
0
18 051
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете попробовать экспортировать все свои хранимые процедуры в текстовый файл, а затем использовать простой поиск.

Более продвинутым методом было бы использование поиска по регулярному выражению для поиска всех записей 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 устарела.

Справочник MSDN

Ответ принят как подходящий

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.

это дает мне идентификатор SP ... могу ли я достичь имени SP с этим идентификатором?

Vinod 23.09.2008 12:06

Да, я изменил запрос, чтобы включить это. Я вижу, что сейчас опубликовано еще несколько ответов, которые также помогут вам.

Luke Bennett 23.09.2008 12:11

Мой ответ здесь: stackoverflow.com/questions/119679/… почти идентичен (возвращает имя). Однако я думаю, что Люк прав в том, что нет необходимости использовать DISTINCT, как в моем ответе

Matt Mitchell 23.09.2008 12:22

Это работает, но не во всех случаях. Например, если кто-то использует больше пробелов или символов табуляции между ключевыми словами SQL и именем таблицы.

splattne 12.11.2008 11:12

Кажется, это работает:

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?

Drew 26.07.2011 18:08

На sys.sql_expression_dependenciesreferencing_id - это элемент, который ссылается на цель, а referenced_id - это зависимость. В таблице также есть схемы и имена сущностей для ссылочных сущностей в таблице. Второстепенные идентификаторы относятся к номерам столбцов, при этом 0 указывает на отсутствие ссылки на конкретный столбец.

ConcernedOfTunbridgeWells 26.07.2011 18:45

Я думаю, что у меня все это вниз. Я думаю, проблема в том, что все мои строки 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 27.07.2011 16:59

@Drew - Да, похоже, что ссылки sproc не перечисляют отдельные столбцы в sys.sql_expression_dependencies. В SQL Server 2008+ есть несколько функций - sys.dm_sql_referencing_entities, sys.dm_sql_referenced_entities - которые будут делать это для определенного объекта и возвращать набор записей с зависимостями на уровне столбцов.

ConcernedOfTunbridgeWells 27.07.2011 20:19

Другие вопросы по теме