Я создал таблицу для среды разработки для тестирования, и есть несколько sp, которые обновляют эту таблицу. Теперь мне нужно отбросить эту таблицу, а также идентифицировать все sp, которые ссылаются на эту таблицу. Мне сложно найти список всех sp. Пожалуйста, предложите некоторый запрос, предположив, что имя таблицы "x", а база данных - SQL Server 2005.
Как идентифицировать все хранимые процедуры, ссылающиеся на определенную таблицу
Ответ 1
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
BTW - вот удобный ресурс для этого типа вопросов: http://msdn.microsoft.com/en-us/library/ms345522%28v=SQL.90%29.aspx
Ответ 2
Ниже описаны работы 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
Ответ 3
Не-запрос будет использовать Sql Server Management Studio.
Найдите таблицу, щелкните правой кнопкой мыши и выберите "Просмотр зависимостей".
ИЗМЕНИТЬ
Но, как говорили комментаторы, это не очень надежно.
Ответ 4
иногда над запросами не будет выдаваться правильный результат, встроенная хранимая процедура доступна для получения зависимостей таблицы как:
EXEC sp_depends @objname = N'TableName';
Ответ 5
Следующий запрос будет извлекать все имена хранимых процедур и соответствующее определение этих SP
select
so.name,
text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and UPPER(text) like '%<TABLE NAME>%'
Ответ 6
ниже запрос работает только для таблицы не для столбца
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
Ответ 7
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", тогда вы получите результаты для обоих.
Ответ 8
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'
GO
Это будет работать, если вам нужно указать имя таблицы.