Как определить все хранимые процедуры, ссылающиеся на определенную таблицу

136

Я создал таблицу среды разработки для целей тестирования, и есть несколько sp, которые обновляют эту таблицу. Теперь мне нужно отбросить эту таблицу, а также идентифицировать все sp, которые ссылаются на эту таблицу. Мне трудно найти список всех sp. Пожалуйста, предложите какой-нибудь запрос, предполагая, что имя таблицы - 'x', а база данных - sql server 2005.

DJay
источник
1
экспертам: как насчет сервера, отличного от MS SQL?
Deian

Ответы:

259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

Кстати, вот полезный ресурс для этого типа вопросов: Запрос FAQ системного каталога SQL Server

Цепи
источник
3
Есть ли причина , чтобы сделать это через доступ к ROUTINE_DEFINITIONна INFORMATION_SCHEMA.ROUTINES?
Мари
1
@Marie - SQL-Server 2005 (AFAIK) этого не имеет.
Цепи
2
Вопрос, находит ли это решение объекты, на которые есть ссылки, когда на них есть ссылки внутри строки? как,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Джефф Кларк 07
1
@ Jeff.Clark - Есть простой способ узнать :-) - но да, он ищет текст процедуры напрямую, чтобы найти его.
Chains
2
да, да :) Мне потребовалось некоторое время, чтобы настроить тест, и я просто искал ленивый / легкий ответ :)
Джефф Кларк
27

Следующее работает на SQL2008 и выше. Предоставляет список как хранимых процедур, так и функций.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
Гай Холлингтон
источник
1
OP нужен ответ для SQL-Server-2005
Chains
19

иногда вышеуказанные запросы не дают правильного результата, существует встроенная хранимая процедура, доступная для получения зависимостей таблиц как:

EXEC sp_depends @objname = N'TableName';
Прамод Павар
источник
1
Для меня это показало триггеры и представления, но не сохраненные процессы.
NealWalters
1
ПРИМЕЧАНИЕ. Я запускал это в системе, где у меня был доступ к таблицам, но не к хранимым процедурам, поэтому, конечно, сохраненные процедуры не отображались в результате.
NealWalters
18

Без запроса можно использовать Sql Server Management Studio.

Найдите таблицу, щелкните правой кнопкой мыши и выберите «Просмотреть зависимости».

РЕДАКТИРОВАТЬ

Но, как сказали комментаторы, это не очень надежно.

Ханс Кеинг
источник
4
В 2005 году информация о зависимостях ненадежна, если объекты не создаются в правильном порядке.
Мартин Смит,
3
Как отметил @Martin Smith, хранимая процедура, ссылающаяся на несуществующий объект, будет создана, хотя и с предупреждением, но не будет помещена в sysdepends. То же самое верно и для хранимых процедур, ссылающихся на таблицу во внешней базе данных: ни в одной из баз данных в sysdepends не помещается никакая запись. Особенностью Antoher является то, что удаление / воссоздание таблицы или представления разрывает цепочку зависимостей. Эти ... эээ ... функции делают отслеживание зависимостей SQL Server в значительной степени бесполезным.
Николас Кэри
7

Следующий запрос получит все имена хранимых процедур и соответствующее определение этих SP.

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
Дипак Котари
источник
5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Просто имейте в виду, что это также приведет к появлению SP, в которых имя таблицы находится в комментариях или где имя таблицы является подстрокой другого имени таблицы, которое используется. Например, если у вас есть таблицы с именами «test» и «test_2», и вы попытаетесь найти SP с помощью «test», вы получите результаты для обоих.

Том Х
источник
2
Такой запрос ненадежен syscommentsдля длинных процедур, поскольку он разбивает определение на блоки по 4000 символов в нескольких строках. sys.sql_modulesизбегает этого.
Мартин Смит
1
Хорошая точка зрения. Я обновил его, чтобы использовать sys.sql_modulesвместо него.
Tom H
3
syscomments был опровергнут в каждом из моих десятков или около того ответов на один и тот же вопрос stackoverflow.com/…
gbn 01
5

Приведенный ниже запрос работает только при поиске зависимостей в таблице, а не в столбце:

EXEC sp_depends @objname = N'TableName';

Однако следующий запрос - лучший вариант, если вы хотите найти всевозможные зависимости, он ничего не упускает. Фактически он дает больше информации, чем требуется.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
Сирадж Ансари
источник
1
Для меня ничего не вернуло в SSMS 2014, работающей с базой данных на SQL Server 12.0)
NealWalters,
3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Это сработает, если вам нужно указать имя таблицы.

RIC
источник
3

В студии управления вы можете просто щелкнуть правой кнопкой мыши по таблице и нажать «Просмотреть зависимости». введите описание изображения здесь

чем вы можете увидеть список объектов, которые зависят от вашей таблицы:введите описание изображения здесь

nzrytmn
источник
1

У вас есть в основном 2 варианта:

----Опция 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

---- Вариант 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Эти 2 запроса предоставят вам все хранимые процедуры, которые ссылаются на нужную вам таблицу. Этот запрос основан на двух таблицах sys: sysobjects и syscomments. В sysobjects хранятся все имена ваших объектов БД, включая хранимые процедуры.

В syscomments содержится текст для всех ваших процедур.

Если вы запросите: SELECT * FROM syscomments

У вас будет таблица, содержащая идентификатор, который является сопоставлением с таблицей sysobjects с текстом, содержащимся в хранимых процедурах, в качестве последнего столбца.

Ален Гави
источник
0

Попробуй это

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Пуджа Чаван
источник